web-dev-qa-db-ja.com

Perlで配列のサイズを探す

配列のサイズを見つけるためのいくつかの異なる方法に遭遇したようです。これら3つの方法の違いは何ですか?

my @arr = (2);
print scalar @arr; # First way to print array size

print $#arr; # Second way to print array size

my $arrSize = @arr;
print $arrSize; # Third way to print array size
232
David

1番目と3番目の方法は同じです。スカラーコンテキストで配列を評価します。これが配列のサイズを取得するための標準的な方法であると考えます。

2番目の方法では、実際には配列の最後のインデックスが返されます。これは(通常)配列サイズとは異なります。

223

まず、2番目のものは他の2つと同等ではありません。 $#arrayは、配列の最後のインデックスを返します。これは、配列のサイズより1小さい値です。

他の2つは実質的に同じです。あなたは単にスカラーコンテキストを作成するために2つの異なる手段を使っています。読みやすさの問題になります。

私は個人的に次のことを好みます。

say 0+@array;          # Represent @array as a number

私はそれよりも明らかにそれを見つけます

say scalar(@array);    # Represent @array as a scalar

そして

my $size = @array;
say $size;

後者は一人でこのようにはっきりしているように見えますが、私は余分な行が他のコードの一部であるとき明快さから奪うことを見つけます。 @arrayがスカラコンテキストで何をするのかを教えるのに役立ちます。$sizeを複数回使用したい場合もあります。

37
ikegami

これは、配列をスカラーコンテキストに強制することによってサイズを取得します。ここで、配列はサイズとして評価されます。

print scalar @arr;

これは、配列をスカラー変数に代入しているため、配列をスカラーコンテキストにするもう1つの方法です。

my $arrSize = @arr;

これは配列の最後の要素のインデックスを取得するので、実際にはサイズから1を引いた値になります(インデックスは0から始まり、Perlでは調整可能ですが、通常これは悪い考えです)。

print $#arr;

この最後のものは、配列サイズを取得するために使用するのはあまり良くありません。単に配列の最後の要素を取得したい場合に便利です。

my $lastElement = $arr[$#arr];

また、ここでスタックオーバーフローを見るとわかるように、この構文はほとんどのシンタックスハイライトで正しく処理されません。

27
Nate C-K

2番目の方法を使用するには、1を追加します。

print $#arr + 1; # Second way to print array size
6
jhoanna

2番目のものを少し修正すると、3つすべてで同じ結果が得られます。

my @arr = (2, 4, 8, 10);

print "First result:\n";
print scalar @arr; 

print "\n\nSecond result:\n";
print $#arr + 1; # Shift numeration with +1 as it shows last index that starts with 0.

print "\n\nThird result:\n";
my $arrSize = @arr;
print $arrSize;
5
Zon

例:

my @a = (undef, undef);
my $size = @a;

warn "Size: " . $#a;   # Size: 1. It's not the size
warn "Size: " . $size; # Size: 2
5
dimas

配列のサイズを印刷するにはさまざまな方法があります。これがすべての意味です。配列がmy @arr = (3,4);だとしましょう。

方法1:スカラー

これは配列のサイズを取得する正しい方法です。

print scalar @arr;  # prints size, here 2

方法2:インデックス番号

$#arrは配列の最後のインデックスを与えます。したがって、配列のサイズが10の場合、最後のインデックスは9になります。

print $#arr;     # prints 1, as last index is 1
print $#arr + 1; # Add 1 to last index to get array size

配列を 0 - インデックス付き とみなして、ここに1を追加します。しかし、もしそれがゼロに基づいていなければ、 この論理は失敗するでしょう

Perl -le 'local $[ = 4; my @arr=(3,4); print $#arr + 1;'   # prints 6

上記の例では、最初のインデックスを4に設定しているので、6が出力されます。これで、indexは5と6になり、それぞれ要素3と4になります。

方法3:

配列がスカラーコンテキストで使用されている場合は、配列のサイズを返します。

my $size = @arr;
print $size;   # prints size, here 2

実際には方法3と方法1は同じです。

2
Kamal Nayan

perlintroのドキュメント“ Perl変数型”セクション

特殊変数$#arrayは、配列の最後の要素のインデックスを示します。

print $mixed[$#mixed];       # last element, prints 1.23

$#array + 1を使って、配列内にいくつの項目があるのか​​を教えたくなります。気にしないでください。それが起こるとき、Perlがスカラー値を見つけることを期待しているところで(“スカラーコンテキストで”)@arrayを使うことはあなたに配列の要素の数を与えるでしょう:

if (@animals < 5) { ... }

perldata documentation“スカラー値”セクション でこれをカバーしています。

配列をスカラーコンテキストで評価すると、配列の長さが返されます。 (これは、Cコンマ演算子のように最後の値を返すリストや、戻り値のように感じるものをすべて返す組み込み関数には当てはまりません。)以下は常に当てはまります。

scalar(@whatever) == $#whatever + 1;

何人かのプログラマーは疑いの余地がないように明示的な変換を使うことを選びます:

$element_count = scalar(@whatever);

同じセクションの前半で、配列の最後の要素のインデックスを取得する方法について説明します。

配列の長さはスカラー値です。 cshのように@daysを評価することで配列$#daysの長さを知ることができます。ただし、これは配列の長さではありません。これは最後の要素の添え字で、通常は0番目の要素があるため、異なる値になります。

2
Greg Bacon

Perldoc perldata から引用しても安全です。

次のことが常に当てはまります。

scalar(@whatever) == $#whatever + 1;

あなたが++を何もしなくても、サイズや配列を不思議なことに大きくしない限りは。

配列インデックスは0から始まります。

そして

Null list()を代入することで、配列をゼロに切り捨てることができます。以下は同等です。

    @whatever = ();
    $#whatever = -1;

これは私が探していたものに私をもたらしますどの配列が空であるかを検出する方法です。 $#empty == -1の場合、見つけました。

2
jwal

スカラーとしての議論を脅かすので、int(@array)はどうでしょうか。

1
Reflective

配列のサイズを調べるには、scalarキーワードを使用します。

print scalar @array;

配列の最後のインデックスを見つけるには$#(Perlのデフォルト変数)があります。それは配列の最後のインデックスを与えます。配列は0から始まるので、$#に1を加えることで配列のサイズを取得します。

print "$#array+1";

例:

my @a = qw(1 3 5);
print scalar @a, "\n";
print $#a+1, "\n";

出力:

3

3
0
Sandeep_black