2012-08-24 44 views
5

Xin lỗi vì có thể không phải là câu hỏi rõ ràng, nhưng tôi hỏi nó, vì tôi không thích đọc smth và không hiểu những gì tôi đang đọc.Lý do tại sao typeglobs có thể được sử dụng như một tài liệu tham khảo trong Perl

Dưới đây là đoạn từ "Lập trình Perl":

Kể từ khi con đường mà bạn dereference một cái gì đó luôn luôn chỉ ra những gì sắp xếp của referent bạn đang tìm kiếm, một typeglob có thể được sử dụng giống như cách một tham chiếu có thể, mặc dù thực tế là một typeglob chứa nhiều tham chiếu của các loại khác nhau. Vì vậy, $ {* main :: foo} và $ {\ $ main :: foo} đều truy cập cùng một biến vô hướng, mặc dù biến sau hiệu quả hơn.

Đối với tôi nó xuất hiện một loại sai lầm, và rằng nó sẽ là đúng nếu nó là như vậy này:

bạn có thể sử dụng một typeglob thay vì biến vô hướng vì tham khảo luôn là một vô hướng và trình biên dịch biết những gì bạn cần.

Nguyên nhân từ trình đọc văn bản của sách có thể giả định rằng tham chiếu có thể khác với biến vô hướng (tức là nhập vô hướng trong bảng biểu tượng). Một khi tôi đã nhìn thấy một cảnh báo: use of array as a reference is deprecated, vì vậy nó xuất hiện với tôi rằng từ lâu đoạn này trong "Lập trình Perl" có ý nghĩa, nguyên nhân có thể không chỉ là một vô hướng, nhưng trong phiên bản mới thứ 4 nó chỉ đơn giản là không thay đổi để tuân thủ Perl hiện đại.

Tôi đã kiểm tra trang errata cho sách này nhưng không tìm thấy gì.

Giả định của tôi có đúng không? Nếu không, sẽ có ai đó rất dễ chịu để giải thích, nơi tôi sai.

Cảm ơn bạn trước.

Trả lời

15

No. Điều đó nói rằng không giống như tham chiếu bình thường, một typeglob chứa nhiều loại nội dung cùng một lúc. Nhưng cách thức mà bạn dereference nó cho biết loại điều bạn muốn:

use strict; 
use warnings; 
use 5.010; 

our $foo = 'scalar'; 
our @foo = qw(array of strings); 
our %foo = (key => 'value'); 

say ${ *foo };     # prints "scalar" 
say ${ *foo }[0];    # prints "array" 
say ${ *foo }{key};    # prints "value" 

Bạn không cần một "typeglob dereferencing cú pháp" đặc biệt vì cú pháp bình thường dereferencing đã chỉ ra mà khe của typeglob bạn muốn để dereference.

Lưu ý rằng điều này không hoạt động với các biến số my, bởi vì các biến từ vựng không liên quan đến typeglobs.

Sidenote: Cảnh báo "mảng làm tham chiếu" không liên quan đến điều này. Nó đề cập đến cú pháp này: @array->[0] (có nghĩa là giống như $array[0]). Đó không bao giờ là cú pháp hợp lệ; nó bị trượt vào trình phân tích cú pháp Perl 5 một cách tình cờ và không được dùng nữa khi Larry nhận thấy.

+0

Tôi có nên đọc nó như 'Nhưng cách thức mà bạn dereference nó cho biết loại tài liệu tham khảo sẽ tạo ra ngầm '? – user907860

+2

@caligula, không, bởi vì bạn không tạo tham chiếu. Một typeglob là một loại tham chiếu rồi. Bạn chỉ cần chọn vị trí trong đó để dereference. – cjm

1

mặc dù điều này không chính xác trả lời câu hỏi của bạn, tôi có thể cố gắng để cho bạn biết những gì tôi trải nghiệm với typeglobs

họ có nhiều năng động hơn vô hướng và tài liệu tham khảo, bởi vì sử dụng một typeglob là loại một cách nói trình biên dịch "đây là một gợi ý, hãy tự đoán xem bạn phải làm gì với nó"

một tham chiếu luôn có loại và mục tiêu nghiêm ngặt. một typeglob chỉ có thể chứa một chuỗi, chỉ ra rằng nó phải trỏ đến một số biến (name) hoặc filehandle (như STDOUT) hoặc một số giá trị khác, có thể truy cập thông qua chuỗi này

có hacks perlish để thực hiện một số điều kỳ lạ, chỉ có thể có với typeglobs, vì vậy tôi nghĩ ngay cả trong perl hiện đại, chúng quan trọng là

1

PerlGuts được minh họa là một cách có thể truy cập để tìm hiểu về Perl internals.

http://www.cpan.org/authors/id/GAAS/illguts-0.09.pdf

Những câu trả lời cho đến nay là minh họa về những gì đang xảy ra, nhưng học cách cửa hàng perl biến sẽ cho phép bạn xem các câu trả lời là thực sự rất đơn giản và suy đang thực sự chưa rõ ràng hơn việc thực hiện.

PS: Bạn rất đáng khen ngợi trong muốn hiểu - nó sẽ đứng bạn thay tốt cho tương lai :)

+0

liên kết bị hỏng. :( – badp