代码之家  ›  专栏  ›  技术社区  ›  joe

如何解决“在空上下文中无用地使用变量”的问题?

  •  18
  • joe  · 技术社区  · 14 年前

    如何解决“在空上下文中无用地使用变量”的问题?

    例如:

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

    我会收到诸如“在空上下文中无用地使用变量”之类的警告?为什么?我该怎么解决?

    3 回复  |  直到 9 年前
        1
  •  25
  •   Cristian    14 年前

    如果要连接参数,请使用 "." 操作员或 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 precedence 以及 Comma operator 更多信息。

        2
  •  16
  •   codaddict    14 年前

    我想您想将字符串片段连接起来形成整个错误消息,因此您必须使用点而不是逗号:

    my $err = $soap_response->code. " ". $soap_response->string. "\n";
    
        3
  •  3
  •   Sinan Ünür    14 年前
    my $err = join(' ', $soap_response->code, $soap_response->string) . "\n";
    

    或者,更好的国际海事组织:

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

    perldoc -f join perldoc -f sprintf perldoc perlop .

    关于警告,请参见 Perldoc Perlop公司 this note on the comma operator .