【发布时间】:2015-06-04 14:25:59
【问题描述】:
我的一位同事在语句后使用逗号而不是分号,结果与以下代码相似:
my $SPECIAL_FIELD = 'd';
my %FIELD_MAP = (
1 => 'a',
2 => 'b',
3 => 'c',
);
sub _translate_to_engine {
my ($href) = @_;
my %mapped_hash
= map { $FIELD_MAP{$_} => $href->{$_} } keys %$href;
$mapped_hash{$SPECIAL_FIELD} = FakeObject->new(
params => $mapped_hash{$SPECIAL_FIELD}
), # << comma here
return \%mapped_hash;
}
起初我很惊讶这通过perl -c,然后我想起了comma operator,并以为我明白发生了什么,但下面两个打印语句的结果让我再次怀疑。
my $scalar_return = _translate_to_engine(
{ 1 => 'uno', 2 => 'dos', 3 => 'tres' }
);
print Dumper $scalar_return;
# {'c' => 'tres','a' => 'uno','b' => 'dos','d' => bless( {}, 'FakeObject' )}
此调用是在标量上下文中进行的,我得到的结果是预期的结果。逗号运算符评估被丢弃的逗号的 LHS,然后评估 RHS。我不相信它可以在这里返回 RHS 的值,因为评估返回语句会离开子程序。
my @list_return = _translate_to_engine(
{ 1 => 'uno', 2 => 'dos', 3 => 'tres' }
);
print Dumper \@list_return;
# [{'c' => 'tres','a' => 'uno','b' => 'dos','d' => bless( {}, 'FakeObject' )}]
此调用是在列表上下文中进行的,但我得到的结果实际上与标量上下文中的调用相同。 我认为这里发生的事情:两个参数都被评估,因为 sub 在列表上下文中被调用,当 RHS 被评估时,return 语句被执行,因此 LHS 被有效地丢弃。
对任何一种情况下发生的特定语义的任何澄清都将不胜感激。
【问题讨论】:
标签: perl