簡體   English   中英

如何在Perl中打印多維數組?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM