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