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 $foo
và my @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.
câu hỏi hay, tôi luôn bị bực mình bởi cú pháp đó – qwwqwwq
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