2016-03-02 148 views
0

我是Perl新手。我正在尝试识别如何打印数组散列的大小。以下是我的代码片段。Perl哈希阵列大小

my %map =(); // Initialization 

while ($line = <>) { 
    chomp($line); 
    // Logic to split the $line 
    push(@{$map{$first_var}}, $rest);  
} 

// Print the amp 
foreach my $value (sort keys %map) { 
    print "$value: @{$map{$value}}\n"; 
} 

在印刷我得到的输出如下格式

valA: (num1 num2 num3 num4) 
valb: (num2 num4) 
valC: (num1 num3 num4) 

我想找出有多少元素与每个键关联(瓦拉,值Valb,valc)。

我尝试:print "Number of nodes in the facility : scalar @{$map{$facility1}}\n";

然而,它给出了作为

valA: scalar (num1 num2 num3 num4) 
valb: scalar (num2 num4) 
valC: scalar (num1 num3 num4) 

祝输出至4,2,3为VALA,值Valb,valC分别示出。我可能会误解,但标量提供了数组的长度。

感谢

+1

当你问上(因此)一个问题,你应该**总是**在你的问题中运行确切的代码,并确保任何输出匹配。 –

+1

''//'不是'perl'中的注释。您的代码无法工作。 – Sobrique

+0

对不起//。我将它添加到Stackoverflow编辑器中,以便更好地实现代码可读性。 – learningMyWayThru

回答

2

您需要将您的打印语句更改为:

print "Number of nodes in the facility : " . scalar(@{$map{$facility}}) . "\n"; 
2

函数调用和表达式双引号字符串内不插*,所以你需要做以下之一:

  • 歇出字符串上下文(例如串联)
  • 将结果存储在打印前的变量的并使用变量而不是
  • 使用printf

这里的每种技术的说明:

use strict; 
use warnings; 

my %hash = (
    foo => [1, 2, 3], 
    bar => [qw(a b c d e f g)], 
    baz => [0 .. 99], 
); 

for my $key (keys(%hash)) { 
    # concatenation 
    print "Number of elements for $key: " . @{$hash{$key}} . "\n"; 

    # temporary variable 
    my $count = @{$hash{$key}}; 
    print "Number of elements for $key: $count\n"; 

    # printf 
    printf("Number of elements for $key: %d\n", scalar(@{$hash{$key}})); 
} 

结果:

Number of elements for bar: 7 
Number of elements for bar: 7 
Number of elements for bar: 7 
Number of elements for baz: 100 
Number of elements for baz: 100 
Number of elements for baz: 100 
Number of elements for foo: 3 
Number of elements for foo: 3 
Number of elements for foo: 3 

*有一个黑客,你可以使用强制这个,但它会严重妨碍你的代码的可读性,a第二它可能会导致你的代码以后的维护者在你希望生病:

print "Number of elements for $key: ${\(scalar(@{$hash{$key}}))}\n"; 

或使用数组引用的同样不好相当于:

print "Number of elements for $key: @{[scalar(@{$hash{$key}})]}\n";