2010-10-18 33 views
13

Tôi hoàn toàn mới đối với Perl. Tôi cần sử dụng mô-đun bên ngoài HTTP :: BrowserDetect. Tôi đã thử nghiệm một số mã và đã cố gắng để có được tên của hệ điều hành từ phương pháp os_string. Vì vậy, tôi chỉ đơn giản là khởi tạo đối tượng và tạo ra một biến để lưu trữ giá trị trả lại.Làm cách nào để đặt giá trị mặc định cho biến Perl?

my $ua = HTTP::BrowserDetect->new($user_agent); 
my $os_name = $ua->os_string(); 

print "$user_agent $os_name\n"; 

có một số tác nhân người dùng không phải là tác nhân người dùng trình duyệt để họ không nhận được bất kỳ giá trị nào từ os_string. Tôi gặp lỗi Use of uninitialized value $os_name in concatenation (.) or string

Làm cách nào để xử lý các trường hợp này khi $ os_name không được khởi chạy vì phương thức os_string trả về undef (đây là những gì tôi nghĩ xảy ra khi đọc mã nguồn mô-đun). Tôi đoán có một cách để đưa ra một chuỗi mặc định, ví dụ: Không có hệ điều hành nào trong những trường hợp này.

Trả lời

17
my $os_name = $ua->os_string() || 'No OS'; 

Nếu $ua->os_string() là falsy (ví dụ: undef, bằng không, hoặc chuỗi rỗng), sau đó phần thứ hai của biểu thức || sẽ được đánh giá (và sẽ là giá trị của biểu thức).

+0

cảm ơn, đây thực sự là một vấn đề rất đơn giản thực sự :). – sfactor

26

Xin lưu ý: cách tiếp cận của câu trả lời gốc ($var = EXPRESSION || $default_value) sẽ tạo giá trị mặc định cho BẤT CỨ "Giá trị sai lệch Perl" được trả lại từ biểu thức, ví dụ: nếu biểu thức là một chuỗi rỗng, bạn sẽ sử dụng giá trị mặc định thay thế. Trong ví dụ cụ thể của bạn, đó có thể là điều đúng để làm (tên hệ điều hành không phải là một chuỗi rỗng), nhưng trong trường hợp chung, nó có thể là một lỗi, nếu những gì bạn thực sự muốn chỉ sử dụng giá trị mặc định thay vào đó của undef.

Nếu bạn chỉ muốn tránh undef giá trị, nhưng chuỗi không có sản phẩm nào hoặc số không, bạn có thể làm:

  • Perl 5.10 và sau: sử dụng "định nghĩa-hoặc nhà điều hành" (//):

    my $os_name = $ua->os_string() // 'No OS'; 
    
  • Perl 5.8 và trước đó: sử dụng một nhà điều hành có điều kiện vì định nghĩa-hoặc là chưa có sẵn:

    my $os_string = $ua->os_string(); # Cache the value to optimize a bit 
    my $os_name = (defined $os_string) ? $os_string : 'No OS'; 
    # ... or, un-optimized version (sometimes more readable but rarely) 
    my $os_name = (defined $ua->os_string()) ? $ua->os_string() : 'No OS'; 
    

Rất nhiều sâu hơn xem chủ đề (bao gồm chi tiết về //) trong bài viết brian d Foy ở đây: http://www.effectiveperlprogramming.com/2010/10/set-default-values-with-the-defined-or-operator/

+1

Gần đây tôi đã giới thiệu một lỗi trong mã của tôi bằng cách sử dụng phương thức '||'. Đã tìm thấy vấn đề trước bài đăng này nhưng không biết về toán tử "được xác định hoặc". Tìm hiểu điều gì đó mới mẻ với Perl mỗi ngày. – ThisSuitIsBlackNot

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