Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 上下文和逗号运算符_Perl - Fatal编程技术网

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' )}]