Я полагаю, что проблема у вас в том, что массивы Perl могут быть массивом только одного фрагмента данных.Вы можете иметь каждую строку в массиве, но вы не хотите хранить один фрагмент данных, вы хотите сохранить 11 частей данных.
К счастью, Perl позволяет хранить ссылки как часть данных в вашем массиве.Эта ссылка может указывать на ... скажем ... другой массив.Взгляните на справочное руководство по Perl , и это должно помочь вам понять, как это можно сделать.
Это действительно довольно простая проблема.Во-первых, давайте создадим цикл, который читает каждую строку и помещает каждую строку в массив с именем @file_array
.
use strict;
use warnings;
use autodie; #So I dont have to worry about my file
open (my $fh, "<", "dataFile.txt");
my @file_array;
while (my $line = <$fh>) {
chomp $line;
push (@file_array, $line);
}
Теперь давайте создадим программу, которая берет каждую строку и разбивает ее на массив:
use strict;
use warnings;
use autodie; #So I dont have to worry about my file
open (my $fh, "<", "dataFile.txt");
my @file_array;
while (my $line = <$fh>) {
chomp $line;
my @line_array = split (/\s+/, $line);
}
Две программы отличаются только одной строкой.Первая разбивает файл на массив, а вторая читает каждую строку и разбивает ее на массив.
Давайте объединим две программы.И вместо того, чтобы помещать $line
в каждый элемент моего @file_array
, я собираюсь поместить * ссылку из @line_array
в каждый элемент моего @file_array
:
use strict;
use warnings;
use autodie; #So I dont have to worry about my file
open (my $fh, "<", "dataFile.txt");
my @file_array;
while (my $line = <$fh>) {
chomp $line;
my @line_array = split(/\s+/, $line);
push (@file_array, \@line_array);
}
Если я хочу поговорить о третьей строке в моем файле, она сохраняется как ссылка в $file_array[2]
.Я могу разыменовать $file_array[2] by putting it in
$ {} , and this would get me back my
@ line_array`:
my @line_array = ${$file_array[2]};
Теперь, если я хочу поговорить о четвертом элементе в этой строке, я могу сказать:
my $element = $line_array[3];
Но я также могу объединить две операции в одну строку.Ниже я разыменую массив, хранящийся в $file_array[2]
, и одновременно беру четвертый элемент (элемент # 3):
my $element = ${$file_array[2]}[3];
Не очистить?К счастью, в Perl есть оператор ->
, который позволяет разыменовывать массив без использования синтаксиса ${}
.Это намного проще для чтения:
my $element = $file_array[2]->[3];
Вы увидите это много в современных программах на Perl.Вот как я говорю о моем массиве массивов.Фактически, Perl даже позволяет в массивах массивов полностью удалять оператор стрелки между массивами.Вы можете говорить об этом элементе так:
my $element = $file_array[2][3];