使用$#运算符

时间:2013-11-27 22:25:16

标签: perl

我刚刚接管了一个Perl系统的维护。它用来运行的机器已经死了,所以我不知道它使用的是哪个版本的Perl,但它正在运行。它包括以下行来计算ASCII文本页面中的行

 my $lcnt = $#{@{$page{'lines'}}};

在Perl 5.10.1中(我们现在在CentOS 6.3上运行它)上面的代码不再有效。我使用以下代码,工作正常。

my @arr = @{$page{'lines'}};
my $lcnt = $#arr;

我会承认我的Perl不是很好,但是从我看到的第一个版本应该永远不会有效,因为它试图尊重数组而不是数组引用

第一个问题 - 我猜测为什么第一行代码现在无法正常工作,其次由于现有Perl版本中现已修复的错误而导致其工作较早?

谢谢!

2 个答案:

答案 0 :(得分:3)

第一个版本从未奏效。假设$page{'lines'}是一个arrayref,这就是你想要的:

my $lcnt = $#{$page{'lines'}};

请注意,这将比你的arraref中的项数少一个。 $#运算符是最后一项的INDEX,而不是项目数。如果您想要$page{'lines'}中的项目数,您可能需要这样:

my $lcnt = scalar(@{$page{'lines'}});

答案 1 :(得分:1)

关于代码的一些事情。这样:

my $lcnt = $#{@{$page{'lines'}}};

永远不对。看看这里发生的三件事

$page{'lines'}   # presumably an array ref
@{ ... }         # dereference into an array
$#{ ... }        # get last index of an array ref

这相当于(继续使用您自己的代码):

my @arr = @{$page{'lines'}};
my $foo = @arr;                 # foo is now the size of the array, e.g. 3
my $lcnt = $#$foo;

如果您使用

use strict;
use warnings;

你应该一直这样做,毫无疑问(!),你会得到提供信息的致命错误信息:

Can't use string ("3") as an ARRAY ref while "strict refs" in use

3将是您的数组的大小)

获取数组大小(元素数)的正确方法是将数组放在标量上下文中:

my $size = @{ $page{'lines'} };

获取最后一个元素的索引的方法是使用$# sigil:

my $last_index = $#{ $page{'lines'} };

正如您将注意到的,语法是相同的,只需使用@$#来获取您想要的内容,就像使用常规数组时一样

my $size = @array;
my $last = $#array;

所以,要回头开头:使用 @$#不是,而且从来都不正确。