2010-07-15 49 views
5

Tôi muốn lặp qua tham chiếu đến một mảng băm mà không cần phải tạo bản sao cục bộ, nhưng tôi tiếp tục không thể sử dụng chuỗi ("1") làm ARRAY ref trong khi "strict refs "lỗi. Tại sao? Làm thế nào để tôi sửa chữa nó?Tài liệu tham khảo trong Perl: Array of Hashes

sub hasGoodCar { 
    my @garage = (
       { 
       model => "BMW", 
       year => 1999 
       }, 

       { 
       model => "Mercedes", 
       year => 2000 
       }, 
       ); 

    run testDriveCars(\@garage); 
}  

sub testDriveCars { 
    my $garage = @_; 

    foreach my $car (@{$garage}) { # <=========== Can't use string ("1") as an ARRAY ref while "strict refs" error 
    return 1 if $car->{model} eq "BMW"; 
    } 
    return 0; 
} 

Trả lời

7

Dòng

my $garage = @_; 

gán chiều dài của @_ đến gara. Trong cuộc gọi đến phương thức testDriveCars bạn vượt qua một đơn vị duy nhất, do đó độ dài là một, do đó thông báo lỗi của bạn về "1".

Bạn có thể viết

my ($garage) = @_; 

hoặc có lẽ

my $garage = shift; 

để thay thế.

Có dấu chấm phẩy còn thiếu trong quá trình đăng - sau khi chuyển nhượng @garage.

Xem perldoc perlsub để biết chi tiết.

+0

Lỗi phổ biến này đến từ việc không hiểu ngữ cảnh. Việc gán cho một vô hướng tạo ra một ngữ cảnh vô hướng, do đó '@ _' được đánh giá là một vô hướng (cho phép chiều dài). – daotoad

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