2010-02-26 31 views
18

Làm cách nào tôi có thể giải quyết trường hợp này "Sử dụng vô dụng biến trong ngữ cảnh void"?Làm cách nào tôi có thể giải quyết trường hợp này "Sử dụng vô dụng biến trong ngữ cảnh void"?

Ví dụ:

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

tôi nhận được cảnh báo như "sử dụng vô dụng của một biến trong một bối cảnh khoảng trống"? Tại sao? Làm thế nào tôi có thể giải quyết nó?

Trả lời

25

Trong trường hợp bạn muốn nối các đối số, sử dụng các "." nhà điều hành hoặc join:

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

Tiếp theo là lý do tại sao Perl cung cấp cho bạn những cảnh báo.

Bạn đang gán cho biến vô hướng $err và phía bên phải của bài tập được đánh giá trong ngữ cảnh vô hướng.

Nhị phân "," là toán tử dấu phẩy. Trong ngữ cảnh vô hướng, nó đánh giá đối số bên trái của nó trong bối cảnh void, ném giá trị đó đi, sau đó đánh giá đối số đúng của nó trong ngữ cảnh vô hướng và trả về giá trị đó.

Đánh giá biến hoặc hằng số và ném giá trị đó đi là vô dụng. Và perl cảnh báo bạn về điều này.

FYI: Một vấn đề có thể với mã của bạn:

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

Việc chuyển nhượng có độ ưu tiên cao cho nên đó là:

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

Xem Perl operators and precedenceComma operator để biết thêm thông tin.

+2

Câu trả lời hay. Nhưng 'đối số đúng' là một chút mơ hồ. Nó gán giá trị sai và không đúng giá trị :).Hãy thử, có lẽ, 'đúng nhất' hoặc 'cuối cùng' hoặc 'cuối cùng' hoặc một cái gì đó. – daotoad

+1

Tôi thực sự thích câu trả lời này tốt hơn nếu nó bao gồm đề cập đến các nhà điều hành nối như "đây là những gì bạn có nghĩa là". – darch

+1

Đây là giải thích tốt hơn về những gì đã xảy ra, nhưng codaddict có một giải pháp tốt hơn. 'join' chỉ là quá mức cần thiết ở đây. Điều anh ta thực sự muốn là toán tử nối, '.'. – cjm

16

Tôi đoán bạn muốn nối các mảnh chuỗi để tạo thành toàn bộ thông báo lỗi, vì vậy bạn sẽ phải sử dụng dấu chấm thay vì dấu phẩy:

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

'" $$ soap_response {code} $$ soap_response {string} \ n "' – ephemient

+3

@ephemient: Điều đó hoàn toàn không giống với mã gốc. Các cuộc gọi phương thức không phải là tra cứu băm (ngay cả khi phương thức chỉ thực hiện tra cứu băm, nó có thể thay đổi trong tương lai). – cjm

+0

@cjm Đó không phải là cuộc gọi phương thức, hãy tự thử. '$$ _ {key}' là '$ {$ _} {key}' là '$ _-> {key}', ngoại trừ việc sau này là một công việc nhỏ hơn để nội suy thành một chuỗi. 'perl -e '$ _ = {key => 1}; in $$ _ {key}, $ {$ _} {key}, $ _-> {key} ''==> 111 – ephemient

Các vấn đề liên quan