我正在查看以下代码段:
my @ret =return (undef) if( $DB_ERROR ); return (undef) unless ($#ret >= 0);
不$#
只是给你一个数组中元素的计数?
$#arrayname
给出最后一个元素的索引,所以如果数组@ret
有2个元素$#ret
则为1.
而且,正如Barry Brown所说,空数组给出了-1.
要获得长度,您可以在标量上下文中使用该数组:
print scalar @ret;
edg是正确的,但原始代码是不必要的钝.在大多数情况下,$#foo
是一个红旗,代码可以更简单地使用scalar @foo
.
return (undef) unless ($#ret >= 0);
unless foo >= bar
很难解开.首先,把它变成一个积极的声明.
return (undef) if ($#ret < 0);
$#ret <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;
请注意,当数组元素为零时,$#数组表达式将返回-1.