URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 8446
[ Назад ]

Исходное сообщение
"помогите реализовать на perl следующие:"

Отправлено gloomy_pilgrim , 25-Сен-09 19:07 
Есть необходимость открывать и лочить несколько файлов в определенной директории для их обработки.
my @file_list = `ls $file_tmp`;
...
тут выбираются только файлы удовлетворяющие определенному условию,
тут все нормально и работает, поэтому пропустил.
...

Далее открываем нужные нам файлы
# open and lock selected files
for(my $i=0; $i<scalar(@file_list); $i++)
{
        open("FILE_$i","<$file_tmp/$file_list[$i]") or die "Can't open $file_tmp/$file_list[$i]: $!";
        flock("FILE_$i",1);
...
}
Вобщем получаем несколько дескрипторов файлов с именам FILE_0, и тд.
И их количество не фиксировано и завист от количестфа файлов.

Далее нужно поочередно считывать часть содержимого файлов в массив.

Так вот тут возникла трудность, как мне правильно организовать это в цикле.
Никак не могу понять, как можно работать с не фиксированным именем дескриптора

Например:
for(my $i=0; $i<scalar(@file_list); $i++)
{
@table = <"FILE_".$i> - естественно это не работает!!!
}

Сорри, в перле новичок, пните в нужную сторону.



Содержание

Сообщения в этом обсуждении
"помогите реализовать на perl следующие:"
Отправлено Андрей , 25-Сен-09 19:13 
1. можно попробовать не открывать все необходимые файлы сразу, а обрабатывать по одному.
открыл, прочитал, закрыл, следующий - как у врача :-)
2. если хочеться держать открытыми все файлы, то дескрипторы можно хранить в массиве и выбирать их оттуда по необходимости.

в perl не силён, поэтому пинать никуда не буду :-)


"помогите реализовать на perl следующие:"
Отправлено Square , 25-Сен-09 19:54 
>[оверквотинг удален]
>Далее нужно поочередно считывать часть содержимого файлов в массив.
>
>Так вот тут возникла трудность, как мне правильно организовать это в цикле.
>
>Никак не могу понять, как можно работать с не фиксированным именем дескриптора
>
>
>Например:
>for(my $i=0; $i<scalar(@file_list); $i++)
>{

$r="FILE_$i";
@table = <$r>;

>@table = <"FILE_".$i> - естественно это не работает!!!
>}
>
>Сорри, в перле новичок, пните в нужную сторону.


"помогите реализовать на perl следующие:"
Отправлено gloomy_pilgrim , 25-Сен-09 22:00 
>>Например:
>>for(my $i=0; $i<scalar(@file_list); $i++)
>>{
>
>$r="FILE_$i";
>@table = <$r>;
>>}
>>

Огромное Спасибо, я пробовал так $r=*"FILE_$i";, блин и почему я сразу без звездочки не попробовал.



"помогите реализовать на perl следующие:"
Отправлено angra , 27-Сен-09 01:46 
>my @file_list = `ls $file_tmp`;

Никогда так не делайте, особенно в циклах. Вызывать внешние программы можно только если реализация действия на perl слишком громоздка или проигрывает в скорости. Прочитайте про glob и opendir/readdir/seekdir/итд

>for(my $i=0; $i<scalar(@file_list); $i++)

Это perl а не С, забудьте про циклы такого вида, есть foreach(на самом деле он синоним к for, но для восприятия их различают), есть map. Создавать переменные с индексами в именах еще большая дурость, даже не знаю откуда она, есть же массивы. Примеры:

my @handler_list;
foreach my $name (@file_list) {
  my $file;
  open($file,"<", "$file_tmp/$name") or die "Can't open $file_tmp/$file_name: $!";
  push @handler_list, $file
}
...
foreach my $h (@handler_list) {
@table=<$h>
}

Можно вместо создания переменной и push использовать напрямую элемент массива
foreach my $name (@file_list) {
open($handler_list[scalar(@handler_list)],"<", "$file_tmp/$name") or die "Can't open $file_tmp/$name: $!";
}