$#array在Perl中意味着什么?

时间:2008-10-27 21:05:44

标签: perl

我正在查看以下代码段:

my @ret = <someMethod>
return (undef) if( $DB_ERROR );
return (undef) unless ($#ret >= 0);

$#只是给你一个数组中元素的数量吗?

4 个答案:

答案 0 :(得分:39)

$#arrayname为您提供最后一个元素的索引,因此如果数组@ret包含2个元素,则$#ret为1。

而且,如Barry Brown所说,空数组给出了-1。

要获得长度,可以在标量上下文中使用数组:

print scalar @ret;

答案 1 :(得分:23)

edg是正确的,但原始代码是不必要的钝。在大多数情况下,$#foo是一个红色标记,可以使用scalar @foo更简单地编写代码。

return (undef) unless ($#ret >= 0);

unless foo >= bar很难解开。首先,把它变成一个积极的声明。

return (undef) if ($#ret < 0);

什么时候是$#ret&lt; 0?当它是-1。 $#ret -1是一个长度为0的数组。所以上面的内容可以简单地写成......

return (undef) if scalar @ret <= 0;

但你不能有一个负长度数组,所以......

return (undef) if scalar @ret == 0;

并且==处于标量上下文中,因此“标量”是多余的......

return (undef) if @ret == 0;

但这只是一种冗长的说法“如果@ret是假的”。

return (undef) if !@ret;

我认为简单的语句修饰符更好地表达为除非。

return (undef) unless @ret;

不是更容易理解吗?

作为最后的附注,不鼓励使用return undef,因为它在列表上下文中做错了。你得到一个包含一个undef元素的列表,这是真的。相反,只需使用一个空白的返回值,它在标量上下文中返回undef,在列表上下文中返回一个空列表。

return unless @ret;

答案 2 :(得分:6)

请注意,当数组为零元素时,$#数组表达式将返回-1。

答案 3 :(得分:2)

总结其他人,如果这样编写,那么代码就更容易理解了:

my @ret = someMethod();
return if $DB_ERROR;
return unless @ret;