始終使用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
我也會清理那些打印語句。如果您不介意,我將使用該更新修改您的帖子。 –
你的程序不會像現在這樣編譯,因爲沒有沒有'use特性'say''或'use 5.010'或類似的'say'。你真的應該''嚴格使用'並'使用警告'以及。爲什麼你使用'for'而不是'while'來讀取文件?而'getColumn'子例程是不必要的。如果你真的想保留它,那麼它可以寫成'map $ _-> [$ col],@ {$ data}'。 – Borodin