Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Системное программирование > чтение и запись в файл


Автор: noder 19.8.2004, 08:45
Народ, подскажите как осуществить чтение все текста из одного файла, запись этого текста в переменную и запись этой переменной в другой файл (или несколько файлов).
Я потихоньку разбираюсь с ПЕРЛом, примерно что то похожее уже сделал, только почему то когда я записываю в файл переменную, записывается только последняя строка текста. Покажите элементарный пример как это правильно делается, а то срочно, по работе надо... Спасибо.

Автор: Secandr 19.8.2004, 08:53
всё просто
открыть на чтение:
Код
open FH, "<file.name";


на запись:
Код
open FH, ">file.name";


читать:
Код
print <FH>;


писать:

Код
print FH "cool";


А вообще-то всё это есть в манулах!

Автор: chaos 19.8.2004, 09:18
Код
open (F1,"<file_for_read");
open (F2,">file_for_write");
while ($str = <F1>) {
 print F2 $str;
}
close(F1);
close(F2);

Вот один из вариантов копирования одного файла в другой

Автор: GoodBoy 19.8.2004, 10:19
noder
Смотри, если ты читаешь так:
Код
while ($str = <F1>) {
   что-то делаем
}
то ты читаешь файл по одной строке. Если же ты хочешь прочиталь весь файл сразу, то читай его вот так:
Код
@strings = <F1>;
тогда в массиве @strings окажутся все строки файла.

Если тебе надо ВЕСЬ этот файл записать в другой, то можно вот так:
Код
print F2 join("", @strings);
здесь все строки из массива @strings объединяются в одну строку и записываются в файл.

Автор: achmed 19.8.2004, 12:39
вот способ прочитать весь файл в одну переменную (а не массив)
$oldsep = $/;
$/=undef;
$data = <F>;
$/ = $oldsep;

поясняю: переменная $/ это разделитеь при при чтении операторм <>, если его сделать undef,
то чтение будет производится пока не кончатся данные в потоке.

см. perldoc perlvar

Автор: y0sh1 30.8.2004, 13:07
Вопрос:
есть скрипт опрашивающий директории и записывающий это в файл... работает около 2 часов... надо бы сделать так, что бы в течении этого времени файл можно было смотреть на предмет уже записанных туда результатов, а то делаю это стандартным open(в начале скрипта) print(в цикле) close(в конце) - в результате в файле что-то появляется только когда скрипт полностью отработает и и закроет его... конечно можно прям в теле цикла открывать его дозаписывать и закрывать, но может есть более оптимальные варианты!? заранее спасибо за ответ...

Автор: ElectricalStorm 30.8.2004, 16:43
$|++;

Автор: y0sh1 30.8.2004, 17:08
ElectricalStorm
Цитата
$|++;

прости... я не так давно за Перлом - что я должен увидеть или в чём смысл!? принтом вывести её на стдаут!?

Автор: ElectricalStorm 30.8.2004, 17:16
Цитата

- в результате в файле что-то появляется только когда скрипт полностью отработает и и закроет его..


вот что бы вывод не буферизировать тоесть что бы сразу появлялось smile.gif

сбрасываешь буферизацию

Код

$|++;

# это просто другое написание $| = 1; :)






Автор: y0sh1 30.8.2004, 17:27
аааа.... это надо после функции write вставить!? попробовал, что-то не идёт... sad.gif
Код
chdir($dir_name);
opendir(D,$dir_name);
while($s_root=readdir(D)) {
if (-d "$s_root") {
 dir_ls ($s_root); #вызываем рекурсию...
 write();               # вот тут происходит запись в файл в цикле
 write(FF);
 $|++;                   # типа пытаюсь сбросить кэш
 }
}


Пускаю скрипт, жду пока пойдёт несколько циклов - смотрю в лог - ничего.... появляется что-то только после того как весь скрипт отработает и файл будет close! В чём ошибка!? sad.gif

Автор: ElectricalStorm 30.8.2004, 17:30
use strict;

$| = 1;

Далее Ваш код



Автор: y0sh1 30.8.2004, 17:39
Не идёт... sad.gif а без use strict; работать будет!? А то у меня его нет, тк с ним ошибку на format выдаёт...!?

Автор: ElectricalStorm 30.8.2004, 17:43
будет работать и без use strict;

весь код запостите

Автор: y0sh1 30.8.2004, 18:24
Код
$| = 1;
# объвл переменных....

sub dir_ls {
       my $save_dir;
       my $root = shift;
       local *DIR_LS;
       opendir DIR_LS ,$root;
       while (my $file = readdir (DIR_LS) ) {
  next if $file =~ /^\.\.?$/;
  next if $root =~ /^\.\.?$/;
           if (-d "$root/$file") {
              dir_ls ("$root/$file");
              }
    # вычисляем объём файлов в каталогах....
       }
}

open (FF, ">> e:\\perl\\log.txt") or die "Oups: $!";
$dir_name="e:\\distr";
chdir($dir_name);
opendir(D,$dir_name);
while($s_root=readdir(D)) {
next if $s_root eq ".";
next if $s_root eq "..";
if (-d "$s_root") {
 dir_ls ($s_root);
 write();
 write(FF);
 $|++;
 }
}
closedir(D);
write();
write(FF);
close (FF);

# далее объявление форматов в которых в лог выводиться расч переменные...

Автор: ElectricalStorm 30.8.2004, 19:02
$|++ вот это из кода уберите

Автор: y0sh1 31.8.2004, 09:03
ElectricalStorm
Цитата
$|++ вот это из кода уберите

вы же сами его сказала написать!!!???

Автор: Guest 31.8.2004, 09:11
понимаете $| - это флаг состояния буферизации вывода
так вот если он установлен в 0 (по умолчанию) значит идет буферизированный вывод а если в 1 то нет

$| = 1; или(!) не и $|++; все флаг установлен


за чем его еще увеличивать ... думайтье о нем как о булеан


Автор: ElectricalStorm 31.8.2004, 09:43
это я был smile.gif

Автор: y0sh1 31.8.2004, 14:49
ну включил небуферизированный вывод - не помогло. sad.gif
Наверно я что-то туплю. (G)

Автор: ElectricalStorm 31.8.2004, 17:30
весь код встудию весь весь .. .

Автор: y0sh1 31.8.2004, 17:38
отправил на почту, что бы не засорять топ...

Автор: ElectricalStorm 1.9.2004, 13:10
ok ща посморю
Добавлено @ 13:20
на до перед open убрать $| = 1;

и поставить в начале скрипта $| = 1; и все заработает




Автор: y0sh1 1.9.2004, 13:27
почему!? какая разница где отключать буферизацию!? Перед объявлением переменных и подпрограмм или перед началом основного кода!?
Переставил - не идёт... sad.gif

Автор: ElectricalStorm 1.9.2004, 14:53
так давай те выяснять что имменно не идет может мы про разные вещи говорим ?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)