私のA; #いくつかの要素を追加します(連続したIDはありません)。$ a [0] = '1'; $ a [5] = '2'; $ a [23] = '3'; $#aを印刷してください、 "\ n"; #23印刷用スカラ(@a)、 "\ n"を印刷します。 #24を印刷する
27
7
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