Perl 上下文和逗号运算符
我的一位同事在语句后使用逗号而不是分号,结果类似于下面的代码:Perl 上下文和逗号运算符,perl,Perl,我的一位同事在语句后使用逗号而不是分号,结果类似于下面的代码: 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
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;
}
这个调用是在标量上下文中进行的,我得到的结果是预期的结果。逗号运算符计算逗号的LHS,然后计算RHS。我不相信它可以在这里返回RHS的值,因为计算return语句会留下子例程
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
如能澄清任何一种情况下出现的具体语义,将不胜感激 你的解释是准确的 调用
\u translate\u to_engine
的上下文是计算函数的所有最终表达式的上下文,包括所有return
的参数。在这种情况下,有两个表达式受到影响:您提到的逗号和\%mapped\u hash
在第一个测试中,返回值是在标量上下文中计算的
\%mapped\u hash
。在第二种情况下,返回值是在列表上下文中计算的\%mapped\u hash
<代码>\%mapped\u散列计算为对散列的引用,与上下文无关。因此,无论上下文如何,sub的结果都是相同的。表达式的LHS是$mapped\u hash{$SPECIAL\u FIELD}=FakeObject->new(…)
,RHS是返回\%mapped\u hash
。正如您所说,逗号操作符计算左侧(它将一个FakeObject实例分配给hash键d
),然后计算右侧,使sub返回hashref。对我来说有道理
在列表或标量上下文中调用子对象并不重要。它不会改变逗号运算符的上下文,这在两种情况下都是相同的 我想我在第二句到最后一句话中说了一些类似于你粗体字的话。谢谢你关于上下文思考的观点,我认为它适用于sub.com中的所有内容。你暗示你没有得到预期的结果,但是你没有指定你期望的结果,所以我不确定需要解释什么。sub调用的上下文不会影响sub中的很多内容。例如,对
%mapped_hash
的赋值是在void上下文中计算的,而$和都是在标量上下文中计算的。
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' )}]