19

この「無効なコンテキストでの変数の無用な使用」のケースを解決するにはどうすればよいですか?

例えば:

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

「voidコンテキストでの変数の無用な使用」などの警告が表示されますか?なんで?どうすれば解決できますか?

4

3 に答える 3

26

引数を連結する場合は、"."演算子またはjoin:を使用します。

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

次は、Perlが警告を出す理由です。

スカラー変数$errに割り当てており、割り当ての右側はスカラーコンテキストで評価されます。

バイナリ" ,"はコンマ演算子です。スカラーコンテキストでは、voidコンテキストで左の引数を評価し、その値を破棄してから、スカラーコンテキストで右の引数を評価し、その値を返します。

変数または定数を評価し、その値を破棄することは無意味です。そしてperlはこれについて警告します。

参考:コードで考えられるもう1つの問題:

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

割り当ての優先順位が高いため、次のようになります。

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

詳細については、Perl演算子と優先順位およびコンマ演算子を参照してください。

于 2010-02-26T14:21:31.243 に答える
16

I guess you wanted to concatenate the string pieces to form the entire error message, so you'll have to use the dot instead of comma:

my $err = $soap_response->code. " ". $soap_response->string. "\n";
于 2010-02-26T14:13:59.983 に答える
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 joinおよびperldoc -f sprintf perldoc perlopを参照してください。

警告については、perldoc perlop、コンマ演算子に関するこのメモを参照してください。

于 2010-02-26T15:30:00.923 に答える