web-dev-qa-db-ja.com

Perlでの配列の初期化

配列を0に初期化するにはどうすればよいですか?

私はこれを試しました。

my @arr = ();

しかし、常に警告がスローされます"初期化されていない値の使用"。事前に配列のサイズがわかりません。動的に入力します。上記のコードはそれを0に初期化するはずだと思いました。

どうすればいいですか?

24
jerrygo

私があなたを理解していれば、おそらくゼロの配列は必要ありません。むしろ、hashが必要です。ハッシュキーは他の配列の値になり、ハッシュ値は値が他の配列に存在する回数になります。

use strict;
use warnings;

my @other_array = (0,0,0,1,2,2,3,3,3,4);
my %tallies;
$tallies{$_} ++ for @other_array;

print "$_ => $tallies{$_}\n" for sort {$a <=> $b} keys %tallies;    

出力:

0 => 3
1 => 1
2 => 2
3 => 3
4 => 1

特定の質問にもっと直接答えるために、ゼロの塊で埋められた配列を作成するには、次の2つの例の手法を使用できます。

my @zeroes = (0) x 5;            # (0,0,0,0,0)

my @zeroes = (0) x @other_array; # A zero for each item in @other_array.
                                 # This works because in scalar context
                                 # an array evaluates to its size.
51
FMc

「配列をゼロに初期化する」とはどういう意味ですか?配列には「ゼロ」は含まれません。「空のリスト」と同じ「ゼロ要素」を含めることができます。または、1つの要素を持つ配列を作成できます。その要素はゼロです:my @array = (0);

my @array = ();は正常に機能するはずです。@arrayという新しい配列を割り当て、空のリスト()を割り当てます。新しい配列の初期値はとにかく空のリストなので、これは単にmy @array;と言うのと同じであることに注意してください。

この行からエラーが発生しているのは確かであり、コードの他の場所ではないのですか?モジュールまたはスクリプトにuse strict; use warnings;があることを確認し、取得したエラーの行番号を確認します。 (ここにいくつかのコンテキストコードを投稿することも役立ちます。)

18
Ether

投稿へのコメントで出力を生成するには、次のようにします。

_use strict;
use warnings;

my @other_array = (0,0,0,1,2,2,3,3,3,4);
my @array;
my %uniqs;

$uniqs{$_}++ for @other_array;

foreach (keys %uniqs) { $array[$_]=$uniqs{$_} }

print "array[$_] = $array[$_]\n" for (0..$#array);
_

出力:

_   array[0] = 3
   array[1] = 1
   array[2] = 2
   array[3] = 3
   array[4] = 1
_

これは、値がゼロの並列配列を生成するというあなたの述べたアルゴリズムとは異なりますが、それを行うより完全な方法です...

要素が0に初期化された最初の配列と同じサイズの並列配列が必要な場合、このステートメントは動的にそれを行います:@array=(0) x scalar(@other_array);しかし、実際には、それを行う必要はありません。

3
dawg