gpt4 book ai didi

perl - 在什么情况下 "unless"与 "if not"不同?

转载 作者:行者123 更新时间:2023-12-01 13:32:27 34 4
gpt4 key购买 nike

我以前以为unlessif not完全等效,但 this Q&A让我意识到它们可以在列表上下文下产生不同的输出:

use strict;
use warnings;
use Data::Printer;
use feature 'say';

my %subs = (
unless => sub {
my ( $value ) = @_ ;

return "$value is a multiple of 3"
unless $value % 3 ;
},
if_not => sub {
my ( $value ) = @_ ;

return "$value is a multiple of 3"
if not $value % 3 ;
},
);

for my $name ( keys %subs ) {

my $sub = $subs{$name};
say $name;
my @results = map { $sub->($_) } 1 .. 10;
p @results;
}

输出
if_not
[
[0] "",
[1] "",
[2] "3 is a multiple of 3",
[3] "",
[4] "",
[5] "6 is a multiple of 3",
[6] "",
[7] "",
[8] "9 is a multiple of 3",
[9] ""
]
unless
[
[0] 1,
[1] 2,
[2] "3 is a multiple of 3",
[3] 1,
[4] 2,
[5] "6 is a multiple of 3",
[6] 1,
[7] 2,
[8] "9 is a multiple of 3",
[9] 1
]

上面的代码片段显示 unlessif not使子例程看到最后计算的表达式的不同值。

好像是因为 if not考虑 not加入 EXPR , 而 unless不认为它是 EXPR 的一部分.

问题

是否还有其他代码使用示例,其中两者不是完全同义的?

最佳答案

不同的是,对于您的unless在这种情况下,最后评估的表达式是 $value % 3而对于您的 if not在这种情况下,最后评估的表达式是 not $value % 3not表现为一个简单的运算符,而 ifunless是像 while 这样的语言结构吗?和 for不涉及表达式的值

在任何情况下,依赖子程序的返回值都是不好的做法,除非它有 return对于每条路径,或者以表达式结尾。 perldoc perlsub 说这个

If no return is found and if the last statement is an expression, its value is returned. If the last statement is a loop control structure like a foreach or a while, the returned value is unspecified.



所以仅仅因为你认为你知道没有 return 的子程序是什么也会求值,除非您以表达式结束子程序,否则它实际上并不可靠,并且在 Perl 的更高版本中可能会发生变化。

只需写一个 return对于您的情况的另一种情况,您的代码将立即变得更加清晰。或者您可以使用条件表达式来指定要为两个条件返回的值
cond_exp => sub {
my ( $value ) = @_;

$value % 3 ? "" : "$value is a multiple of 3";
}

关于perl - 在什么情况下 "unless"与 "if not"不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45154732/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com