2012-02-15 153 views
-3

我寫這個小程序。它編譯但它只是沒有按預期打印數組大小。我的程序有什麼問題?這個短程序有什麼問題?

#!/usr/bin/perl -w 

use strict; 
use warnings; 
my $primaryFeatures 
= { foo => [ 'fool', 'food', 'foot' ], 
    bar => ['barricade'], 
    }; 
my $arraysize = $#{$primaryFeatures->{"foo"}}+1; 
print $arraysize; 
+2

你得到什麼錯誤?它是打印錯誤的結果還是你收到警告或錯誤? – 2012-02-15 21:20:49

回答

3

您正在使用數組引用作爲您的散列值(因爲您應該),因此您需要取消引用數組引用。

另外,如果您在標量上下文中使用數組,則返回數組的大小。一般而言,您應該贊同使用$#構造。

#!/usr/bin/perl -w 

use strict; 
use warnings; 
my $primaryFeatures = { 
    foo => [ 'fool', 'food', 'foot' ], 
    bar => ['barricade'], 
}; 
my $arraysize = @{$primaryFeatures->{foo}}; 
print $arraysize; 
+0

+1 - '$#'是數組中最後一個元素的索引號。例如,如果(現在不推薦使用)'$ ['變量的值已被更改,它可能與數組元素的數目不同。 – 2012-02-15 21:24:23

+0

@Leonardo Herrera,如果'$ ['正在使用,那麼'$#a + $ ['仍然會返回正確的值。這不會使'$#'錯誤。 – ikegami 2012-02-15 21:34:15

+1

'$#{array}'和'@ {array} - 1'的區別在於前者是左值,後者是右值。只要知道這個消息會讓你談起;實際使用它可能是大規模恥辱的理由。 '$ {array} [++ $#{array}] =「new value」'因此是一個混淆的'push @ {array},「new value」'。 – tchrist 2012-02-15 21:48:21

2

沒有什麼錯你的計劃。

$ cat x.pl 
use strict; 
use warnings; 
my $primaryFeatures 
= { foo => [ 'fool', 'food', 'foot' ], 
    bar => ['barricade'], 
    }; 
my $arraysize = $#{$primaryFeatures->{"foo"}}+1; 
print $arraysize, "\n"; 

$ perl x.pl 
3 

(我添加了一個新行到輸出,但是這是不相關的問題。)

我發現下面的清潔劑,雖然:

my $arraysize = @{ $primaryFeatures->{foo} }; 
+0

謝謝,但是爲什麼如果我寫「print $ arraysize;它會按照設計打印出來,當我寫「print $ arraysize」時,\ n「; – user288609 2012-02-15 22:04:11

+0

你輸出的是輸出嗎?你可能會受到緩衝的影響,如果這樣'$ | = 1;'會有幫助。這個輸出的唯一區別就是在數字後面是否輸出換行符) – ikegami 2012-02-15 22:16:03

+0

@ user288609如果你嘗試'perl -e'print 3',在沒有看到打印值的時候,你會得到相同的「錯誤」嗎?你可能會注意到,由於值不是以換行符結束的,它與提示符合並,例如'3user @ ubuntu:〜$'。至少在* nix系統。 – TLP 2012-02-15 22:20:05