web-dev-qa-db-ja.com

Perlでの配列要素のカウント

最後のIDではなく、配列内の合計アイテムを取得するにはどうすればよいですか?

これを行うために私が見つけた2つの方法のどれも:

my @a;
# Add some elements (no consecutive ids)
$a[0]= '1';
$a[5]= '2';
$a[23]= '3';

print $#a, "\n"; # Prints 23
print scalar(@a), "\n"; # Prints 24

私は3を取得する予定でした...

27
grilix

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関数は、スパース配列のアイテムの数を返します。ハッシュを使用してスパース配列をエミュレートする唯一の欠点は、順序が重要な場合、キーを反復処理する前にキーをソートする必要があることです。

また、 delete 関数を使用してスパース配列から項目を削除することも忘れないでください(値をundefに設定するだけでは不十分です)。

16
Chas. Owens

代わりに(またはさらに)ハッシュが必要な場合があります。配列は要素の順序付けられたセットです。 $foo[23]を作成すると、$foo[0]を介して$foo[22]を暗黙的に作成します。

14
ysth

print scalar grep {defined $ _} @a;

8
kcwu
@people = qw( bob john linda ); 
$n = @people; # the number 3
Print " le number in the list is $n \n"; 

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

2
Zhugo
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;
0
santosh