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

时间:2010-02-26 14:10:51

标签: string perl scope warnings void

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

例如:

  my $err = $soap_response->code, " ", $soap_response->string, "\n";
  return $err;

我收到类似“在无效环境中无用地使用变量”的警告?为什么?我该如何解决?

3 个答案:

答案 0 :(得分:25)

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

my $err = $soap_response->code. " ". $soap_response->string. "\n";
my $err = join '', $soap_response->code, " ", $soap_response->string, "\n";

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

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

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

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

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

my $err = $soap_response->code, " ", $soap_response->string, "\n";

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

(my $err = $soap_response->code), " ", $soap_response->string, "\n";

有关详细信息,请参阅Perl operators and precedenceComma operator

答案 1 :(得分:16)

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

my $err = $soap_response->code. " ". $soap_response->string. "\n";

答案 2 :(得分:3)

my $err = join(' ', $soap_response->code, $soap_response->string) . "\n";

或者,更好的IMO:

return sprintf "%s %s\n", $soap_response->code, $soap_response->string;

请参阅perldoc -f joinperldoc -f sprintf perldoc perlop

关于警告,请参阅perldoc perlopthis note on the comma operator