2012-02-15 129 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