0

この投稿の一番の答え:Perlで多次元配列を作成するにはどうすればよいですか?次のように多次元配列を作成することをお勧めします。

my @array = ();
foreach my $i ( 0 .. 10 ) {
  foreach my $j ( 0 .. 10 ) {
    push @{ $array[$i] }, $j;
  }
}

配列をよりコンパクトに構築し、ネストされたループを回避する方法があるかどうか疑問に思っています。たとえば、次のようなものを使用します。

my @array = ();
my @other_array = (0 ... 10);
foreach my $i ( 0 .. 10 ) {
    $array[$i] = @other_array; # This does not work in Perl
  }
}

Perlは、ネストされたループなしで多次元配列を構築するためのそのような構文をサポートしていますか?

同様に、(ネストされた)ループなしで多次元配列を印刷する方法はありますか?

4

2 に答える 2

7

それを行うには複数の方法があります。

生成

pushLISTを受け入れる

my @array;
push @{$array[$_]}, 0 .. 10 for 0 .. 10;

代替構文:

my @array;
push @array, [ 0 .. 10 ] for 0 .. 10;

map目の保養

my @array = map { [ 0 .. 10 ] } 0 .. 10;

代替構文:

my @array = map [ 0 .. 10 ], 0 .. 10;

印刷

最小限のループで

print "@$_\n" for @array;

Perl5.10以降の場合

use feature 'say';
say "@$_" for @array;

より多くのフォーマット制御で

print join( ', ', @$_ ), "\n" for @array;   # "0, 1, 2, ... 9, 10"

「ループなし」 (ループはあなたから隠されています)

use Data::Dump 'dd';
dd @array;

Data::Dumper

use Data::Dumper;
print Dumper \@array;

詳細については、perldoc perllolをご覧ください

于 2012-09-12T16:09:03.973 に答える
2

あなたは近くにいます、あなたは他の配列への参照が必要です

my @array;  # don't need the empty list
my @other_array = (0 ... 10);
foreach my $i ( 0 .. 10 ) {
    $array[$i] = \@other_array;
    # or without a connection to the original
    $array[$i] = [ @other_array ];
    # or for a slice
    $array[$i] = [ @other_array[1..$#other_array] ];
  }
}

リストを中括弧で囲んで、匿名(名前なし)の配列参照を直接作成することもできます[]

my @array;
foreach my $i ( 0 .. 10 ) {
    $array[$i] = [0..10];
  }
}

編集:接尾辞を使用して印刷するのがおそらく最も簡単ですfor

print "@$_\n" for @array;

数値多次元配列の場合は、を使用できますPDL。さまざまなユースケースに対応するいくつかのコンストラクターがあります。上記に類似したものはxvalsです。PDLオブジェクトは印刷をオーバーロードするため、印刷するだけでよいことに注意してください。

use PDL;
my $pdl = xvals(11, 11);
print $pdl;
于 2012-09-12T15:59:03.963 に答える