2011-11-15 34 views
5

Trong khi duyệt CPAN, tôi đã xem một khối mã trong số this module làm tôi bối rối.Tại sao lại sử dụng khối "do {} if" trong Perl?

sub import { 
    for my $mod (keys %INC) { 
    do { 
     delete $INC{$mod}; 
     $mod =~ s/\.pm$//; $mod =~ s/\//::/g; 
     delete_package($mod); 
    } if $mod =~ m/^SOAP/; 
    } 
} 

Tại sao tác giả sử dụng một khối do {} if thay vì một if khối thường xuyên?

+6

Không gian tên Acme. Tại sao bạn mong đợi sự tỉnh táo? :) – Hugmeir

+4

Cá nhân tôi sử dụng 'cho $ mod của tôi (phím% INC) {tiếp theo nếu $ mod! ~/^ SOAP /; ...} '. Chỉ định tiêu chí cho vòng lặp lên phía trước và tránh mức thụt lề như một phần thưởng. – ikegami

+0

@Hugmeir haha ​​- đó là câu trả lời hoàn toàn hợp lệ, bạn nên gửi nó :) –

Trả lời

4

Bởi vì họ cảm thấy thích nó. Không có sự khác biệt thực sự. Perl có hàng chục cách để làm mọi thứ. Nó chỉ là cách ngôn ngữ.

+1

+1 Tôi luôn luôn thích nghe "tại sao không?". – fncomp

1

Bởi vì trong perl "Có nhiều cách để làm điều đó"

2

Đối với tôi, nó có vẻ như một cách để nhấn mạnh các mã bên càng if so với điều kiện if riêng của mình.

2

Tác giả muốn sử dụng nếu ở cuối, nhưng nó phải ở cuối một câu lệnh không nhiều. Một do {} là một câu lệnh, do đó sẽ hoạt động.

Cá nhân, tôi sẽ sử dụng câu lệnh if, nhưng đó là vấn đề về hương vị cho dù sự nhấn mạnh nên có trên hành động hay điều kiện. Trong trường hợp này tác giả đã chọn nhấn mạnh hành động.

+0

(+1) Tôi cảm thấy rất khó hiểu khi viết "Làm điều gì đó khác", giống như nói "_I ở nhà ** mỗi ngày ** (trừ ngày làm việc) _" – Gonen

5

Một khác biệt là do { ... } trả về một giá trị trong khi một câu lệnh if không (mặc dù xem các ý kiến ​​dưới đây.)

Ví dụ:

my $x = 3; 
my $z = do { warn "in the do block"; 10 } if $x == 3; 

Bạn có thể thực hiện hầu như điều tương tự với các ternary toán tử, mặc dù bạn không thể sắp xếp các câu lệnh trong các nhánh của toán tử bậc ba.

+2

nếu câu trả lời quá giá trị. Bạn không thể chỉ định chúng trực tiếp do cú pháp hơi phức tạp một chút. Nhưng nếu bạn nhúng nó đúng cách, bạn có thể thấy rằng nếu trả về một giá trị. Đây là một đoạn mã tương đương: 'my $ z = do {if ($ x == 3) {cảnh báo" trong khối lệnh "; 10}}' Mã của bạn gọn gàng hơn, vì vậy tôi vẫn nghĩ rằng một câu trả lời hợp lý, không hoàn toàn chính xác về mặt kỹ thuật. –

+0

Tôi đồng ý - đó là cách chính xác hơn để xem xét tình huống. – ErikR

+0

Hai ví dụ đó giống hệt với Perl .... –

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