[英]How can I print a multidimensional array in Perl?
我試圖在Perl中打印多維數組(矩陣),將對數組的引用傳遞給子例程。
這是我的代碼:
sub print_matrix(\@) {
my $array = shift;
for my $i ( 0 .. $#{ $array } ) {
my $row = $array[$i];
for my $j ( 0 .. $#($row) ) {
print $array[$i][$j];
}
}
}
Borodin告訴您代碼有什么問題。
現在考慮以下模塊: Data :: Dumper (在CPAN上可用)。 您可以使用此模塊來打印任何數據結構:arrayrefs的arrayref(您稱為矩陣),hashref的hashref,hashref的arrayref,hashref的hashref或這些結構的任何其他組合,可以根據需要選擇任意多個維度。 當然,如果尺寸太大,可能會導致輸出混亂。
我的意思是,不久前,在一次采訪中有人問我如何實現此模塊。 我認為這是一個非常聰明的問題。 我不得不考慮一下,因為我經常使用該模塊,但從不費心去弄清楚它是如何工作的。 實際上非常簡單。 想象一下,在您的子例程中,您收到了一個引用,但是您實際上並不知道它是哪種引用(scalarref,arrayref,hashref等),您將如何確定它呢? 如果您有多種可能性,您將如何處理所有這些可能性? 您是否考慮過創建遞歸函數?
因此,要快速解決問題,如果只想打印矩陣以進行調試,請使用Data :: Dumper 。 否則,如果您想做一些更復雜的事情並希望涵蓋多種情況,請嘗試創建一個遞歸函數。
這是一個Data :: Dumper示例:
my $arrayref = [
[ qw/ a b c d / ],
[ qw/ e f g h / ],
[ qw/ i j k l / ],
];
use Data::Dumper;
print Dumper $arrayref;
這是您將得到的結果:
$VAR1 = [
[
'a',
'b',
'c',
'd'
],
[
'e',
'f',
'g',
'h'
],
[
'i',
'j',
'k',
'l'
]
];
矩陣的每個“行”都打印為元素列表,並在一對方括號內用逗號(和換行)分隔。 請注意,如果將數組傳遞給它,它將逐一打印每個元素,並且您將丟失“尺寸”。 如果只有數組,則必須像這樣將其作為引用傳遞:
print Dumper \@array;
我希望這有幫助。
當矩陣中只有一個字母輸入時,使用普通print
是可以的,但是像Text :: Table這樣的模塊可以使整齊的輸出變得更加容易。 例如,
#!/usr/bin/env perl
use strict;
use warnings;
use Text::Table;
my @matrix = map {
[ map sprintf('%.2f', -500 + rand(1000)), 1 .. 5 ]
} 1 .. 5;
my $mat = Text::Table->new;
$mat->load(@matrix);
print $mat;
輸出:
-7.73 -83.85 -351.18 21.06 320.40 174.83 238.29 91.16 361.43 213.04 446.43 -4.82 322.81 10.38 -436.62 -128.05 195.68 199.05 288.39 115.30 -251.19 -329.35 244.13 -428.25 454.64
您可以像這樣簡單地打印二維Perl數組
use strict;
use warnings;
my @arr_2d = (
[ qw/ a b c d / ],
[ qw/ e f g h / ],
[ qw/ i j k l / ],
);
print_2d(\@arr_2d);
sub print_2d {
my ($matrix) = @_;
print "@$_\n" for @$matrix;
}
輸出
a b c d
e f g h
i j k l
更新資料
這是您自己的代碼的有效版本。 您沒有正確使用數組引用,並在應有括號的地方加上了括號。 此版本還在每個元素之后打印一個空格,並在每行之后打印一個換行符。
sub print_matrix {
my $array = shift;
for my $i ( 0 .. $#{ $array } ) {
my $row = $array->[$i];
for my $j ( 0 .. $#{ $row } ) {
print $array->[$i][$j], ' ';
}
print "\n";
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.