Как хранить переменные-массивы внутри другого массива? - PullRequest
3 голосов
/ 07 апреля 2011

У меня есть Perl-запрос на сохранение массивов внутри другого массива. Соответствующий запрос задавался ранее ( Как добавить ссылку на массив в середину существующего массива в Perl? ), но я не смог найти ответ на свой, поэтому я публикую его здесь.

У меня есть 10 текстовых файлов, каждый из которых содержит примерно 100 строк текста. Я хочу выделить все эти строки, содержащие слово «важный». Сценарий выполнения этой операции приведен ниже. Я сохраняю все строки, содержащие слово «важное» в массиве. Итак, из каждого текстового файла я получаю массив. Я хочу сохранить все эти массивы внутри другого массива?

my @list_of_files = ("input1.txt", "input2.txt","input3.txt"); my $list_of_files = @list_of_files;

for ($file=0, $file<$list_of_files; $files++){
 open INPUT_FILE, "$list_of_files[$file]" or die "can't open $file : $!";
 my @input = <INPUT_FILE>;
 my $size = @input;

 for ($num=0; $num<$size; $num++){
  if ($input[$num] =~ m/important/) {
   push (@sub_array, $output);
  }
 }
 close INPUT_FILE;
 push (@main_array, \@sub_array);   
}

элементы @sub_array меняются каждый раз, так как мне сохранить элементы всех sub_arrays? Я хотел бы иметь окончательный вывод в виде @main_array, который содержит 3 элемента, каждый элемент является массивом элементов (строки, содержащие слово «важное»)

Любая помощь очень ценится TIA

Ответы [ 3 ]

5 голосов
/ 07 апреля 2011

Я бы сделал это немного иначе, чем BVR.Но его очки все еще стоят.

# use qw() to define line with less punctuation
my @list_of_files = qw(input1.txt input2.txt input3.txt);

my @lines_in_file;

foreach my $file (@list_of_files) {
  open(my $in, '<', $file) or die "can't open $file : $!";

  # declare an array, not a scalar
  my @lines;

  # idiomatic use of while(<>) puts each record into $_
  while (<$in>) {
    # /../ works on $_ by default.
    # Postfix condition is more readable
    push @lines, $_ if /important/;
  }

  # Take reference to array and push it onto main array
  push @lines_in_file, \@lines;
}
4 голосов
/ 07 апреля 2011

Я бы решил вашу проблему следующим образом:

my @list_of_files = ("input1.txt", "input2.txt", "input3.txt");

my @lines_in_file = ();                 # target array
for my $file (@list_of_files) {
    open(my $in,'<',$file) or die "can't open $file : $!";

    my $lines = [];                     # scalar containing arrayref for important lines
    while(my $input = <$in>) {
        if($input =~ /important/) {
            push @$lines, $input;       # push into arrayref
        }
    }
    close $in;

    push @lines_in_file, $lines;        # push arrayref into main array
}

Несколько замечаний:

  • Perl для массива can travers без хлопот в стиле C для
  • лучше обрабатывать файл построчно, а не считывать целые данные в память, особенно для строчной обработки
  • [] создавать новый массивref на каждой итерации.Если вы повторно используете @sub_array в каждом цикле и берете ссылку на него, вы получите множество ссылок на одну и ту же вещь
3 голосов
/ 07 апреля 2011

Если вы собираетесь что-то писать на Perl время от времени, вам нужно будет понять, как работают ссылки и как создавать сложные структуры данных.

Будучи новичком в Perl, я бы порекомендовал вам посетить perldoc.perl.org , раздел руководств и пройти первые три урока. Это займет у вас около полутора часов, и у вас будет представление о том, как решить вашу проблему и другие подобные проблемы.

Учебники действительно полезны - кратки и практичны. Вы научитесь передавать структуры данных и повторять их, и все такое.

Для тестирования рассмотрите возможность использования Data :: Dumper и print Dumper($var) для быстрого просмотра сложных структур данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...