2013-06-29 25 views
8

Các documentation for the open function cho thấy cú pháp của open() như:Tại sao tài liệu Perl open() sử dụng hai kiểu FILEHANDLE khác nhau?

  • filehandle mở, EXPR
  • mở filehandle, MODE, EXPR
  • mở filehandle, MODE, EXPR, DANH
  • mở filehandle, MODE, THAM KHẢO
  • mở FILEHANDLE

Xuống các ví dụ họ có địa điểm nơi một biến bình thường $ -prefixed được sử dụng cho các tập tin xử lý:

open(my $fh, "<", "input.txt") 

và cũng ví dụ nơi một bareword được sử dụng:

open(FOO, "|tr '[a-z]' '[A-Z]'"); 

Một câu hỏi là tên của mỗi phong cách là những gì như trong " Tôi đang sử dụng _ _ đối với một filehandle "trong mỗi trường hợp? Cái khác là, tại sao họ bắt đầu sử dụng các từ trống cho open() trong tài liệu? Dường như việc sử dụng sau này tất cả không liên quan đến tên tệp thông thường open() s. Biểu mẫu $ -prefixed có được chấp nhận trong các trường hợp đó không?

+1

câu hỏi hay, tôi luôn bị bực mình bởi cú pháp đó – qwwqwwq

+0

Kinda gây phiền nhiễu để làm 'mở (STDOUT," | ít ")' theo bất kỳ cách nào khác hơn thế. – tchrist

Trả lời

20

Hình thức biểu mẫu chủ yếu về bản chất, chỉ là di sản lịch sử để tương thích ngược. Sử dụng một biến từ vựng là khá nhiều luôn luôn Điều phải làm trong mã mới.

→ tình cờ, $x là một từ vựng vô hướng biến, nơi FOO là, như bạn nói, được gọi là một bareword

chi tiết/digression

Chỉ cần cho đầy đủ, như đã chỉ ra trong @Joe_Z các chú thích, các đối tượng tập tin từ vựng là “tương đối mới”, như là một phần của việc viết lại khá lớn giữa Perl 5,005 và 5,6 (chúng thậm chí còn thu được toàn bộ các đơn vị độ lớn trong số phiên bản đó…).

Tuy nhiên, về mặt kỹ thuật, chủ thể FOO (hoặc, ví dụ: STDIN) được diễn giải trong một không gian tên riêng chỉ dành cho tệp thủ công. Vì không có một sigil (như $ @ % &) của namespace filehandle, chỉ có hai cách để tham khảo một filehandle trong namespace rằng:

  • Bạn có thể tham khảo nó trong các khe cắm gián tiếp đối tượng của chức năng nhất định, như print, người sẽ (sau hậu trường) phỏng đoán rằng một người gác phải tham khảo một tập hồ sơ, vì lý do lịch sử;
  • Bạn có thể sử dụng typeglob, như *FOO, đề cập đến “bất kỳ thứ gì trong bất kỳ không gian tên nào bị ràng buộc với ký hiệu FOO.

Lưu ý rằng trong một số ngôn ngữ, như C hoặc Scheme, một biểu tượng duy nhất có không sigils loại, và vì vậy tất cả những biểu tượng có thể bị ràng buộc chỉ trong cách này (ví dụ như người ta không thể có một biến có tên printf và một hàm có tên printf trong C… nói chung), trong khi ở Perl hoặc (ví dụ) Lisp chung, cùng một biểu tượng foo có thể bị ràng buộc với nhiều thứ khác nhau; sự khác biệt là Perl thực sự yêu cầu bạn sử dụng sigils để phân biệt “mà foo ý bạn là” trong hầu hết các ngữ cảnh. $foo, @foo = @foo[ $x .. $y], $foo[ $n ], %foo = @foo{ $k1, $k2 } = $foo{ $k }, &foo và các loại tương tự.

Bằng cách sử dụng barewords như filehandles, tuy nhiên, bạn sẽ mất một số khả năng:

đáng kể, để ràng buộc họ tại địa phương hoặc giải nghĩa từ vựng (thay vì trên toàn cầu), bạn cần phải ràng buộc mỗi biểu tượng trong mọi không gian tên, bởi vì không có sigil. Do đó, my $foomy @foo có thể tồn tại trong hai bàn di chuột khác nhau (phạm vi), nơi có thể là một trong những ngoại lệ khác; nhưng my *foo sẽ bao gồm cả hai loại này, cũng như tập tin đính kèm foo (và các trường hợp góc tối nghĩa khác, chẳng hạn như format specifiers, mặc dù tôi sẽ không thề với nó).

Nó cũng vô cùng khó khăn để chuyển một tập tin kiểu thủ công theo phong cách vào một chức năng, và tương tự.

Về cơ bản, barewords kế thừa tất cả các nhược điểm của phạm vi toàn cầu và không có lợi thế của các biến từ vựng.

perldoc perldata có phần đẹp trên Typeglobs và Filehandles có thể giải thích những điều này rõ ràng hơn một chút. Tôi không có bản sao của tôi tiện dụng, nhưng tôi tin rằng Camel cũng đi vào chi tiết hơn về chủ đề này.

+5

+1: Sử dụng các tập tin từ vựng là 'cách để làm điều đó' mặc dù đó là Perl để TMTOWTDI (có nhiều cách để thực hiện). –

+1

@JonathanLeffler cả điểm mạnh và lỗ hổng. – jordanm

+0

coz Tôi là một chút skool cũ tôi đã thỉnh thoảng sử dụng globhand tập tin phong cách trong câu trả lời và luôn nhận được ý kiến ​​tiêu cực về điều này :) Đồng ý rằng tập tin từ vựng là tốt hơn nhưng đó là một thói quen khó để phá vỡ! – Vorsprung

2

Như BPRocock cho biết, my $x được ưa thích trong những ngày này, trong khi FOO được coi là lỗi thời vì FOO là một loại biến toàn cục. Có một lý do khác là $x được khuyến khích: $x sẽ tự động được close chỉnh sửa ở cuối phạm vi.