27


7

最後のIDではなく、配列内のアイテムの総数を取得する方法を教えてください。

私はこれを行うことがわかった2つの方法のどれも:

私のA; #いくつかの要素を追加します(連続したIDはありません)。$ a [0] = '1'; $ a [5] = '2'; $ a [23] = '3';

$#aを印刷してください、 "\ n"; #23印刷用スカラ(@a)、 "\ n"を印刷します。 #24を印刷する

私は3を得ることを期待しています…​

6 回答


39


編集:ハッシュ対配列

cincodenadaがコメントの中で正しく指摘しているように、ysthはもっと良い答えを出しました:私はあなたの質問に別の質問で答えたほうがよいでしょう:「あなたは本当にPerl配列を使いたいですか? ハッシュがより適切かもしれません。」

配列は、これまでに使用された最大のものまで、考えられるすべてのインデックスにメモリを割り当てます。 この例では、24個のセルを割り当てます(ただし、3つだけ使用します)。 これとは対照的に、ハッシュは実際に使用されているフィールドにスペースを割り当てるだけです。

*配列解法:スカラーgrep *

これは2つの可能な解決策です(説明については下記を参照):

print scalar(grep {defined $_} @a), "\n";  # prints 3
print scalar(grep $_, @a), "\n";            # prints 3

説明: `$ a [23]`を追加した後、あなたの配列は実際には24個の要素を含みます---しかしそれらの大部分は未定義です(これもfalseと評価されます)。 あなたは定義された要素の数を数えることができます(最初の解決策のように)または本当の要素の数を計算すること(第2の解決策)。

違いはなんですか? `$ a [10] = 0`と設定した場合、最初の解はそれをカウントしますが、2番目の解はカウントしません(0は偽だが定義されているので)。 `$ a [3] = undef`に設定した場合、どの解決策もそれを数えません。

ハッシュソリューション(ystによる)

別の解決策で示唆されているように、ハッシュを使って作業し、すべての問題を回避できます。

$a{0}  = 1;
$a{5}  = 2;
$a{23} = 3;
print scalar(keys %a), "\n";  # prints 3

この解はゼロとundefの値を数えます。


16


sparse arrayが欲しいようです。 通常の配列には24個の項目がありますが、スパース配列には3個あります。 Perlでは、スパース配列をハッシュでエミュレートします。

#!/usr/bin/perl

use strict;
use warnings;

my %sparse;

@sparse{0, 5, 23} = (1 .. 3);

print "there are ", scalar keys %sparse, " items in the sparse array\n",
    map { "\t$sparse{$_}\n" } sort { $a <=> $b } keys %sparse;

スカラーコンテキストでの `keys`関数は、疎配列の要素数を返します。 ハッシュを使用してスパース配列をエミュレートすることの唯一の欠点は、キーの順序が重要な場合はキーを反復処理する前にキーをソートする必要があることです。

また、http://perldoc.perl.org/functions/delete.html [delete]関数を使ってスパース配列から項目を削除することを忘れないでください(値をundefに設定するだけでは不十分です)。


14


多分あなたは代わりに(あるいはそれに加えて)ハッシュが欲しいのです。 配列は順序付けられた要素の集合です。 `$ foo [23]`を作成した場合、 `$ foo [0]`から `$ foo [22]`までを暗黙的に作成します。


8


スカラを印刷するgrep \ {defined $ _} @a;


2


@people = qw(ボブジョンリンダ); $ n = @people; #数字3 "リスト中のファイル番号は$ n \ n"です。

Perlの式は常にそのコンテキストに適した値を返します。 たとえば、配列の「名前」*はどうでしょうか。 リストコンテキストでは、それは要素のリストを与えます。 しかしスカラーコンテキストでは、配列内の要素数を返します。


0


sub uniq {return keys%{{map {$ _ => 1} @_}}; my @my_array =( "a"、 "a"、 "b"、 "b"、 "c"); #print join( ""、@my_array)、 "\ n"; my $ a = join( ""、uniq(@my_array)); my @b = split(/ /、$ a); my $ count = $#b