2012-06-11 27 views
5

Các mã sau hoạt động tốt với Active Perl 5.14.2:Perl không tương thích vấn đề với nhau trong một băm băm - 5,14 → 5.8.8

my %hzones =(); 
#%hzones= (
# 'zone1' => { 
#     'ns1' => 'ip1', 
#     'ns1' => 'ip2', 
#     }, 
# 'zone2' => { 
#     'ns1' => 'ip1', 
#     'ns2' => 'ip2' 
#     } 
#); 

foreach my $k1 (keys %hzones) { 
    debug("# $k1",$d); 
    while (my ($key, $value) = each($hzones{ $k1 })) { # Problem is here 217 
     while (my ($nsname, $nsip) = each(%$value)) { 
      debug("## $nsname , $nsip",$d); 
    } 
    # Creation de la zone et ajout dans infoblox 
    $session->add(createZone($k1)) or error("Add zone for ".$k1." failed: ", 
     $session->status_code(). ":" .$session->status_detail()); 
    } 
} 

Bây giờ, nếu tôi cố gắng sử dụng mã này trên RedHat 5.3 với Perl 5.8.8, tôi có lỗi sau:

Type of arg 1 to each must be hash (not hash element) at 
    ./migration-arpa.pl line 217, near "}) " 
Execution of ./migration-arpa.pl aborted due to compilation 
    errors. 

Câu hỏi: làm thế nào để khắc phục lỗi này? Làm thế nào để tôi đi qua hashtable của tôi?

+13

Perl 5.7 là bản phát hành * cổ * ** phát triển **. Không sử dụng nó. – Quentin

+2

Red Hat 5.3 đi kèm với Perl 5.8.8 là tiêu chuẩn (xem http://vault.centos.org/5.3/os/i386/CentOS/). Nếu bạn đang chạy 5.7 thì điều đó có nghĩa là ai đó đã hạ cấp phiên bản Perl của bạn thành phiên bản phát triển (ví dụ: không ổn định) của Perl. Thực sự, đừng sử dụng nó cho bất kỳ công việc nghiêm túc nào. –

+0

Ông nói rằng ông đang sử dụng 5.8.8 trong bài viết. Đối tượng phải là lỗi đánh máy. Đã sửa. – ikegami

Trả lời

17

Quentin nói gì, nhưng bạn có thể thử thay thế

each($hzones{ $k1 }) 

với

each(%{$hzones{ $k1 }}) 

mà dereferences ref băm.

+9

Hỗ trợ tự động sắp xếp lại các hashrefs đã được thêm vào trong Perl 5.14] (http://perldoc.perl.org/perl5140delta.html#Syntactical-Enhancements). – Quentin

3

Khả năng chuyển một tham chiếu đến each (each($hzones{ $k1 })) là introduced trong 5.14.0. Trước đó, người ta phải vượt qua một băm (each(%{ $hzones{ $k1 })). Điều đó vẫn hoạt động, và nó sẽ tiếp tục hoạt động.

Vì vậy, để tương thích ngược, sử dụng

each(%{ $hzones{ $k1 }) 

thay vì

each($hzones{ $k1 }) 

Lưu ý: Đi qua một tham chiếu đến each được đánh dấu là thử nghiệm, và tôi coi nó buggy vì nó không làm làm việc với tất cả các băm.

+0

Nếu thử nghiệm để chuyển tham chiếu đến 'mỗi', thì cách nào tốt nhất để sử dụng mà không có' mỗi'? – Yohann

+0

@Yohann, Cách thay thế duy nhất (trong khi vẫn sử dụng 'mỗi') là chuyển một băm, như được hiển thị. – ikegami

+0

Tôi đã rất vui mừng về nó, và bây giờ tôi đồng ý, có quá nhiều trường hợp lẻ. Tôi cố gắng không bao giờ sử dụng nó. Thật không may tôi vô tình quên mất một dereferencing '%' trước một vô hướng một lần, mã làm việc, vì vậy tôi phát hành ... và đã phá vỡ tất cả mọi thứ trước khi 5,14. Oh tốt, dễ dàng khắc phục, nhưng bài học kinh nghiệm. –

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