我在查看以下代码片段:
my @ret = <someMethod>
return (undef) if( $DB_ERROR );
return (undef) unless ($#ret >= 0);
$#
只返回数组中元素的数量吗?
我在查看以下代码片段:
my @ret = <someMethod>
return (undef) if( $DB_ERROR );
return (undef) unless ($#ret >= 0);
$#
只返回数组中元素的数量吗?
$#arrayname
可以得到最后一个元素的索引,所以如果数组@ret
有两个元素,则$#ret
为1。
并且,正如Barry Brown所指出的那样,空数组返回-1。
要获取长度,可以在标量上下文中使用数组:
print scalar @ret;
edg是正确的,但原始代码过于晦涩。在大多数情况下,$#foo
是一个警示标志,说明代码可以更简单地使用scalar @foo
。
return (undef) unless ($#ret >= 0);
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
为false”的冗长表达方式。return (undef) if !@ret;
return (undef) unless @ret;
这样不是更容易理解吗?
最后需要注意的是,return undef
不被推荐使用,因为在列表上下文中它会做出错误的操作。你会得到一个包含一个undef元素的列表,该元素为真。相反,只需使用空返回,在标量上下文中返回undef,在列表上下文中返回空列表。
return unless @ret;
$#foo
有其用处,但在大多数情况下它们表明代码可能更简单。完整的三部分循环本身就是一个警示标志,以及按索引迭代。for my $idx (0..$#foo)
有其用处,但通常可以更好地编写为 for my $thing (@foo)
。 - Schwern@foo
时使用$#foo
非常普遍。 - Schwern请注意,当数组元素为零时,$#array表达式将返回-1。
my @ret = someMethod();
return if $DB_ERROR;
return unless @ret;
return;
和return undef;
的行为是不同的(分别返回一个空列表和包含undef
的单元素列表)。 - melpomene