Есть необходимость открывать и лочить несколько файлов в определенной директории для их обработки.
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> - естественно это не работает!!!
}Сорри, в перле новичок, пните в нужную сторону.
1. можно попробовать не открывать все необходимые файлы сразу, а обрабатывать по одному.
открыл, прочитал, закрыл, следующий - как у врача :-)
2. если хочеться держать открытыми все файлы, то дескрипторы можно хранить в массиве и выбирать их оттуда по необходимости.в perl не силён, поэтому пинать никуда не буду :-)
>[оверквотинг удален]
>Далее нужно поочередно считывать часть содержимого файлов в массив.
>
>Так вот тут возникла трудность, как мне правильно организовать это в цикле.
>
>Никак не могу понять, как можно работать с не фиксированным именем дескриптора
>
>
>Например:
>for(my $i=0; $i<scalar(@file_list); $i++)
>{$r="FILE_$i";
@table = <$r>;>@table = <"FILE_".$i> - естественно это не работает!!!
>}
>
>Сорри, в перле новичок, пните в нужную сторону.
>>Например:
>>for(my $i=0; $i<scalar(@file_list); $i++)
>>{
>
>$r="FILE_$i";
>@table = <$r>;
>>}
>>Огромное Спасибо, я пробовал так $r=*"FILE_$i";, блин и почему я сразу без звездочки не попробовал.
>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: $!";
}