The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
помогите реализовать на 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 следующие:, !*! 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: $!";
    }




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру