Как я могу разрешить этот случай бесполезного использования переменной в пустом контексте?

Как я могу решить этот случай «Бесполезного использования переменной в пустом контексте»?

Например:

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

Я получаю предупреждения типа «Бесполезное использование переменной в пустом контексте»? Почему? Как я могу решить эту проблему?


person joe    schedule 26.02.2010    source источник


Ответы (3)


Если вы хотите объединить аргументы, используйте оператор "." или join:

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

Далее, почему Perl выдает вам предупреждения.

Вы присваиваете скалярной переменной $err, и правая часть присваивания оценивается в скалярном контексте.

Двоичный "," - это оператор запятой. В скалярном контексте он оценивает свой левый аргумент в пустом контексте, отбрасывает это значение, затем оценивает свой правый аргумент в скалярном контексте и возвращает это значение.

Вычислять переменную или константу и отбрасывать это значение бесполезно. И perl предупреждает вас об этом.

FYI: еще одна возможная проблема с вашим кодом:

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

Присвоение имеет более высокий приоритет, поэтому:

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

См. операторы Perl и их приоритет и Оператор запятой для получения дополнительной информации.

person Community    schedule 26.02.2010
comment
Отличный ответ. Но «правильный аргумент» немного двусмысленен. Присваивается неправильное значение, а не правильное :). Попробуйте, возможно, «самый правый», или «последний», или «последний», или что-то в этом роде. - person daotoad; 26.02.2010
comment
Мне бы очень понравился этот ответ, если бы он включал упоминание оператора конкатенации, поскольку это то, что вы имели в виду. - person darch; 26.02.2010
comment
Это лучшее объяснение того, что пошло не так, но у codaddict есть лучшее решение. join здесь просто излишество. Что ему действительно было нужно, так это оператор конкатенации .. - person cjm; 27.02.2010

Я предполагаю, что вы хотели объединить части строки, чтобы сформировать полное сообщение об ошибке, поэтому вам придется использовать точку вместо запятой:

my $err = $soap_response->code. " ". $soap_response->string. "\n";
person codaddict    schedule 26.02.2010
comment
@ephemient: это совсем не то же самое, что исходный код. Вызовы методов не являются поиском по хешу (даже если метод просто выполняет поиск по хешу, в будущем он может измениться). - person cjm; 26.02.2010
comment
@cjm Это не вызовы методов, попробуйте сами. $$_{key} равно ${$_}{key} равно $_->{key}, за исключением того, что последнее требует немного больше усилий для интерполяции в строку. perl -e'$_ = {key=>1}; print $$_{key}, ${$_}{key}, $_->{key}' ==› 111 - person ephemient; 26.02.2010
comment
@ephemient, дело в том, что исходный код в OP использует вызовы методов, а не поиск хэшей. - person friedo; 26.02.2010
comment
@friedo @cjm О, я совершенно пропустил это. Во. "${\scalar $soap_response->code} ${\scalar $soap_response->string}\n" но на самом деле это чертовски уродливо. - person ephemient; 27.02.2010

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 и это примечание об операторе запятая.

person Sinan Ünür    schedule 26.02.2010
comment
+1 за версию sprintf, что является правильным способом сделать это, ИМО. - person RET; 14.09.2010