2010-02-01 27 views
13

Đây là những cái tôi biết:Những mẫu mã perl nào có thể dẫn đến hành vi không xác định?

  1. Hành vi của một "my" tuyên bố sửa đổi với một sửa đổi tuyên bố có điều kiện hoặc vòng lặp cấu trúc (ví dụ "my $x if ...").
  2. Sửa đổi một biến hai lần trong cùng một tuyên bố, như $i = $i++;
  3. sort() trong bối cảnh vô hướng
  4. truncate(), khi LENGTH lớn hơn chiều dài của tập tin
  5. Sử dụng số nguyên 32-bit, "1 << 32" là undefined . Việc dịch chuyển bởi số bit âm cũng không được xác định.
  6. Phân bổ không vô hướng cho biến "trạng thái", ví dụ: state @a = (1..3).
+1

Đây phải là cộng đồng wiki – Quentin

+3

Tôi rất thích thú khi biết tại sao ai đó nghĩ rằng câu hỏi này nên được đóng lại. –

+0

Nó không thực sự là một câu hỏi có thể trả lời được, vì nó hỏi về hành vi không được hỗ trợ và không xác định trong đặc tả Perl, cũng như bất kỳ lỗi nào có thể bị ẩn. – Ether

Trả lời

3

Đây chỉ là biến thể về chủ đề của sửa đổi một cấu trúc đang được lặp lại:

map, grepsort nơi tham khảo đang làm thay đổi các danh sách các mục để sắp xếp.

Một vấn đề khác với sort phát sinh nơi tham khảo mã không idempotent (trong khoa học viễn tưởng cảm giác comp) - sort_func($a, $b) phải luôn luôn trả về giá trị tương tự cho bất kỳ trao $a$b.

+1

Tôi không thể nhớ được hoàn cảnh nào nữa nhưng cùng một lúc tôi đã cố gắng lạm dụng 'phân loại' bằng cách chuyển nó thành một loại không độc đáo với kết quả kỳ quái. –

3

Cách dễ dàng để vượt qua vòng lặp là phá vỡ vòng lặp trong khi lặp qua băm với each.

#!/usr/bin/perl 

use strict; 
use warnings; 

my %name_to_num = (one => 1, two => 2, three => 3); 

find_name(2); # works the first time 
find_name(2); # but fails this time 

exit; 

sub find_name { 
    my($target) = @_; 

    while(my($name, $num) = each %name_to_num) { 
     if($num == $target) { 
      print "The number $target is called '$name'\n"; 
      return; 
     } 
    } 
    print "Unable to find a name for $target\n"; 
} 

Output:

The number 2 is called 'two' 
Unable to find a name for 2 

Điều này rõ ràng là một ví dụ ngớ ngẩn, nhưng điểm vẫn đứng - khi lặp lại thông qua một băm với each bạn nên hoặc không bao giờ last hoặc return ra khỏi vòng lặp; hoặc bạn nên đặt lại trình lặp (với keys %hash) trước mỗi tìm kiếm.

+0

Rất hữu ích! cảm ơn! – snoofkin

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