【问题标题】:What does $#array mean in Perl?$#array 在 Perl 中是什么意思?
【发布时间】:2008-10-27 21:05:44
【问题描述】:

我在看下面的代码sn-p:

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

$# 是否只是为您提供数组中元素的计数?

【问题讨论】:

  • 我将标题中的 $# 更改为 $#array。你应该意识到 $# 本身就是一个神奇的变量(虽然我认为它在 Perl 5.10 中被删除了)
  • 另外,我想指出您的脚本中存在潜在的错误。你不应该返回(undef),而只是说返回。在列表上下文中,您的函数将评估为 true!

标签: perl


【解决方案1】:

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

而且,正如 Barry Brown 所指出的,空数组给出 -1。

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

print scalar @ret;

【讨论】:

  • 另外,如果@ret 中没有任何内容,$#ret 将返回-1。
【解决方案2】:

edg 是正确的,但原始代码不必要地迟钝。在大多数情况下,$#foo 是一个危险信号,表明使用scalar @foo 可以更简单地编写代码。

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

unless foo &gt;= bar 很难解开。首先,把它变成一个积极的陈述。

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

什么时候 $#ret

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;

【讨论】:

  • 而 $#foo 不是危险信号的地方将在数组切片中... my @five_to_end = @foo[ 5 .. $#foo ];
  • 回复:return undef 被劝阻。在某些情况下,即使在列表上下文中,您也确实希望返回显式 undef。这取决于通常如何使用该功能。不是你不应该使用return undef,只是你不应该在不考虑“我为什么在这里使用return undef”的情况下使用它。如果你有一个好的答案,那就去做吧。
  • > $#foo 是一个危险信号,代码不,不是。两者都有不同的用途。 @foo 是元素的计数,$#foo 是最后一个索引。如果你正在运行一个 for-index 循环,你想使用$#foo。与提到的数组切片 @draegtun 相同。对于 OP 提供的用例,@foo 更准确,因为这些语句只是检查元素的非零计数。
  • @BrendanByrd 是的,它们确实有不同的用途。 $#foo 有其用途,但在大多数情况下它们表明代码可以更简单。完整的 3 部分 for 循环本身就是一个危险信号,按索引迭代也是如此。 for my $idx (0..$#foo) 有其用途,但通常可以更好地写成for my $thing (@foo)
  • @BrendanByrd 澄清一下,红旗表示需要加强审查;不是被禁止的东西。我发现新手(和许多教程)在应该使用 @foo 时使用 $#foo 很常见。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    总结一下其他人,如果这样写,代码会更清晰:

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

    【讨论】:

    • 这在语义上是不同的。 return;return undef; 在列表上下文中的行为不同(分别返回一个空列表和一个包含 undef 的单元素列表)。
    猜你喜欢
    • 2011-12-22
    • 2018-03-05
    • 2010-12-28
    • 2023-03-25
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 2020-05-21
    • 1970-01-01
    相关资源
    最近更新 更多