如何解决"无效使用void上下文中的变量"的情况?

joe*_*joe 18 string perl warnings scope void

如何解决"无效使用void上下文中的变量"的情况?

例如:

  my $err = $soap_response->code, " ", $soap_response->string, "\n";
  return $err;
Run Code Online (Sandbox Code Playgroud)

我收到警告,例如"在void上下文中无用的变量"?为什么?我该如何解决?

Eug*_*ash 25

如果要连接参数,请使用"."运算符或join:

my $err = $soap_response->code. " ". $soap_response->string. "\n";
my $err = join '', $soap_response->code, " ", $soap_response->string, "\n";
Run Code Online (Sandbox Code Playgroud)

接下来是Perl为您提供警告的原因.

您正在分配标量变量$err,并且在标量上下文中评估赋值的右侧.

二进制" ,"是逗号运算符.在标量上下文中,它在void上下文中计算其左参数,抛出该值,然后在标量上下文中计算其右参数并返回该值.

评估变量或常数并抛弃该值是没有用的.而perl警告你这件事.

仅供参考:您的代码可能存在另一个问题:

my $err = $soap_response->code, " ", $soap_response->string, "\n";
Run Code Online (Sandbox Code Playgroud)

赋值具有更高的优先级,因此:

(my $err = $soap_response->code), " ", $soap_response->string, "\n";
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请参阅Perl运算符和优先级以及逗号运算符.

  • 很好的答案.但"正确的论点"有点含糊不清.它分配错误的值而不是正确的:).也许,尝试"最正确"或"最终"或"最后"或某事. (2认同)

cod*_*ict 16

我想你想连接字符串片段以形成整个错误信息,所以你必须使用点而不是逗号:

my $err = $soap_response->code. " ". $soap_response->string. "\n";
Run Code Online (Sandbox Code Playgroud)

  • @ephemient:这与原始代码完全不同.方法调用不是哈希查找(即使该方法只进行哈希查找,它可能在将来发生变化). (3认同)