Всегда используйте use strict;
и use warnings;
!!
У вас есть несколько вопросов:
push(@col, @xz);
В этом случае, вы потери информации в @xz
массиве. После этого цикла, вы в конечном итоге с помощью одного массива, который выглядит следующим образом:
@col = (7, 2, 3, 3, 2, 8, 6, 7, 2);
Так, при печати:
print "$col[0]\n";
Вы получаете, что нулевой элемент: 7.
Мы можем сохранить структуру данных с помощью reference:
#! /usr/bin/env perl
#
use strict; # Lets you know when you misspell variable names
use warnings; # Warns of issues (using undefined variables
use feature qw(say);
use Data::Dumper;
my @columns;
for my $data (<DATA>) {
my @data_list = split /\s+/, $data;
push @columns, \@data_list;
}
say Dumper \@columns;
__DATA__
7 2 3
3 2 8
6 7 2
Здесь вы видите, я включил Data::Dumper распечатать структуру @columns
:
$VAR1 = [
[
'7',
'2',
'3'
],
[
'3',
'2',
'8'
],
[
'6',
'7',
'2'
]
];
Как вы можете видеть, каждая запись в массиве @columns
теперь другой массив. Однако при печати $columns[0]
ссылка на массив не будет печатать то, что вы хотите. Вместо этого он собирается напечатать ссылку Нулевое массива: 7, 2, 3, а не нулевой элемент каждой ссылки массива: 7, 3, 6.
Для этого нам понадобится подпрограмму, которая будет идти через @columns
и распечатать нулевую запись каждого из массивов. Здесь я создаю подпрограмму с именем fetch_index
что закачает переданный индекс переданного массива:
#! /usr/bin/env perl
#
use strict; # Lets you know when you misspell variable names
use warnings; # Warns of issues (using undefined variables
use feature qw(say);
use Data::Dumper;
my @columns;
for my $data (<DATA>) {
my @data_list = split /\s*/, $data;
push @columns, \@data_list;
}
say join ", ", fetch_index(0, @columns);
sub fetch_index {
my $entry = shift; #Entry you want from all arrays
my @array = @_;
my @values;
for my $array_ref (@array) {
push @values, ${array_ref}->[$entry];
}
return @values;
}
__DATA__
7 2 3
3 2 8
6 7 2
подпрограмма просто проходит через каждую ссылку на массив я хранится в моем массиве, и принес значение $entry
от массив. Я вставляю их в мой массив @values
и возвращаю его.
@RonBergin Хороший улов, спасибо! – rchang
Я бы также очистил эти печатные заявления. Если вы не возражаете, я отредактирую ваше сообщение с этим обновлением. –
Ваша программа не будет компилироваться, поскольку она не существует, потому что нет 'say' без функции использования say'' или' use 5.010' или аналогичной. Вы действительно должны «использовать строгие» и «использовать предупреждения» на месте. Есть ли причина, по которой вы использовали 'for' вместо' while' для чтения файла? И подпрограмма 'getColumn' не нужна. Если вы действительно хотите сохранить его, тогда его можно записать 'map $ _-> [$ col], @ {$ data}'. – Borodin