2016-03-02 184 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";