2010-09-19 36 views
5

Trích dẫn từ Perl::Critic::Policy::InputOutput::ProhibitExplicitStdinTại sao tôi nên sử dụng <ARGV> hoặc <> thay vì <STDIN> trong Perl?

Perl có một filehandle ma thuật hữu ích được gọi * argv để kiểm tra dòng lệnh và nếu có bất kỳ đối số, mở ra và đọc những người như tập tin. Nếu không có đối số, * ARGV hoạt động như * STDIN thay thế. Hành vi này hầu như luôn là thứ bạn muốn nếu bạn muốn tạo chương trình đọc từ STDIN. Điều này thường được viết bằng một trong hai hình thức tương đương sau:

while (<ARGV>) { 
    # ... do something with each input line ... 
} 
# or, equivalently: 
while (<>) { 
    # ... do something with each input line ... 
} 
  • Có "chỉ là một ước" hoặc đang có một số lý do rắn không sử dụng <STDIN>?

Tôi cảm thấy <STDIN> làm cho ý định của mã của tôi rõ ràng hơn sử dụng <> hoặc <ARGV>.

Dòng chảy của mã của tôi là như thế này

my @inp = <STDIN>; 
my $len = $inp[0]; 

... 

for(my $i = 0; $i < ($len + 0); $i++) { 
    my @temp = split (' ', $inp[$i]); 
    ... 
} 

Trả lời

5

Đó là bởi vì sử dụng <ARGV> sẽ cho phép người dùng chỉ định một trong hai file để đọc từ như các đối số, hoặc các công cụ ống vào stdin khi xác định không có đối số. Nếu bạn sử dụng <STDIN>, chỉ đường ống sẽ hoạt động. Tất nhiên là tùy thuộc vào bạn để quyết định xem bạn có nghĩ rằng mọi người muốn có thể chỉ định tệp dưới dạng đối số dòng lệnh hay không, nhưng đó là điều rất nhiều chương trình hỗ trợ để có thể đáng suy nghĩ.

+0

Cảm ơn. Nếu đây là lý do duy nhất thì tôi cảm thấy '' là tốt hơn. – Lazer

+1

@Lazer: nó không phải là "tốt hơn", nó áp đặt các hạn chế theo cách bạn có thể sử dụng chương trình. Tại sao điều đó không cần thiết? – Ether

+0

Perl :: Phê bình dựa trên cuốn sách "Thực tiễn tốt nhất của Perl", chỉ đơn giản tuyên bố: "Tránh sử dụng * STDIN, trừ khi bạn thực sự muốn nói đến nó." Sự biện minh được đưa ra là một phiên bản dài hơn của câu trả lời ở trên. Nếu bạn thực sự có nghĩa rằng chỉ STDIN sẽ làm, không có đối số dòng lệnh được chấp nhận - sau đó sử dụng STDIN rõ ràng. – jmanning2k

6

Bạn sử dụng công cụ thực hiện những gì bạn muốn làm. Xem perlvar để được giải thích về ARGV tập tin. ARGV cũng đọc từ tên tệp bạn chỉ định trên dòng lệnh. Có lẽ bạn muốn tính năng đó, có thể bạn không.

Và, bạn không phải làm gì Perl :: Critic nói. Nhiều người trong số những chính sách này là ý kiến ​​của một nhóm nhỏ người. Nếu bạn chỉ muốn đọc từ STDIN một cách rõ ràng, đó là những gì bạn cần làm. Những người viết các chính sách phê bình không có ở đó để nêu rõ những gì bạn cần làm. Yêu cầu bất kỳ câu hỏi như thế này là chủ yếu là vô nghĩa mà không có bối cảnh của ứng dụng của nó. Quy tắc chung chỉ đơn thuần là chung, và chia nhỏ khi nói về các trường hợp cụ thể.

Tôi không chắc chắn lý do tại sao bạn cho rằng ý định của mình rõ ràng hơn với STDIN vì bạn không cho chúng tôi biết ý định của bạn. Mã hầu như không bao giờ nói cho chính nó bởi vì chúng ta có xu hướng mã giải pháp thay vì nêu vấn đề. Giải pháp có thể không phải là giải pháp phù hợp.

Trong trường hợp của bạn, tôi nghĩ rằng mã này là rõ ràng hơn bởi vì nó được viết bằng Perl thay vì phương ngữ C bạn đang sử dụng :)

chomp(my $length = <STDIN>); 

my $count = 0; 
while (<STDIN>) { 
    last if $count++ > $lines_to_read; 

    my @temp = split ' '; 
    ...; 
    } 
Các vấn đề liên quan