我正在查看以下代码段:
my @ret = <someMethod>
return (undef) if( $DB_ERROR );
return (undef) unless ($#ret >= 0);
$#
只是给你一个数组中元素的数量吗?
答案 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;