2013-06-13 30 views
5

Tôi không thể tìm thấy bất cứ nơi nào những gì :: là cho trong Perl. Ví dụ:Perl Ký tự cú pháp "::"

$someVariable::QUERY{'someString'}; 

Cảm ơn!

Trả lời

4

Nó được bao gồm trong Perlmod.

:: thực sự là một không gian tên số nhận dạng. Đầu Perl trước khi ý tưởng này của namespace mất giữ, bạn có thể có xung đột tên biến xảy ra trong chương trình của bạn:

Dưới đây là chương trình của tôi:

#! /usr/bin/env perl 

#use strict; 
use warnings; 
use feature qw(say); 

require "test2.pl"; 

$foo = "bar"; 

futz_with_foo(); 

say $foo; 

tôi đặt $foo-thanh và không bao giờ chạm vào nó. Nên in ra bar Tuy nhiên, khi tôi chạy chương trình của tôi, tôi nhận được:

$ ./test.pl 
WOO WOO! I MESSED WITH FOO! 

Trong test2.pl, tôi có:

sub futz_with_foo { 
    $foo = "WOO WOO! I MESSED WITH FOO!" 
} 
1; 

gì xảy ra là cả hai chương trình đang sử dụng cùng một biến $foo. Để giải quyết vấn đề này, Perl cung cấp cho các mô-đun khả năng có không gian tên riêng của họ. Cú pháp ban đầu là một trích dẫn duy nhất, nhưng đã thay đổi thành :: trong Perl 4 (nếu tôi nhớ chính xác). Bạn vẫn có thể sử dụng dấu nháy đơn. Bạn khai báo không gian tên của mình với package.

Cách tốt nhất để hiểu điều này là xem nó hoạt động.Hãy thử như sau:

#! /usr/bin/env perl 

use strict; 
use warnings; 
use feature qw(say); 

our $foo = 'This is the value of $foo'; 

say '$foo: ' . $foo; 
say '$main::foo: ' . $main::foo; 
say "\$main'foo: " . $main'foo;; 

say "\nSwitching to package Bar"; 
package Bar; 

our $foo = 'This is in package Bar'; 

say '$foo: ' . $foo; 
say '$Bar::foo: ' . $Bar::foo; 

say "\nSwitching to package main again"; 
package main; 

say '$foo: ' . $foo; 

Chạy này, tôi nhận được:

$foo: This is the value of $foo 
$main::foo: This is the value of $foo 
$main'foo: This is the value of $foo 

Switching to package Bar 
$foo: This is in package Bar 
$Bar::foo: This is in package Bar 

Switching to package main again 
$foo: This is in package Bar 

Theo mặc định, chương trình của bạn bắt đầu ra trong chính namespace. Nhân tiện, bạn sẽ nhận thấy rằng tôi đã khai báo our $foo chứ không phải my $foo. Đó là vì our đặt biến trong bảng biểu tượng Perl trong đó các biến số gói được lưu trữ. Các my là một tuyên bố lexically scoped, và bây giờ là ưa thích. Biến được khai báo với my chỉ tồn tại trong phạm vi được khai báo và không thể nằm ngoài tệp của nó.

Có thể điều này sẽ làm sáng tỏ thông báo lỗi khi bạn quên khai báo biến với my:

Global symbol "$foo" requires explicit package name at ... 

Theo mặc định, tất cả các biến Perl là gói biến (có nghĩa là, họ đang ở trong bảng biểu tượng Perl). Các pragma use strict buộc bạn phải khai báo các biến gói với our hoặc buộc bạn phải sử dụng tên gói đầy đủ của biến. Bằng cách khai báo một biến với my (như chúng ta làm 99 40/100% thời gian) và bằng cách sử dụng strict, chúng tôi buộc bạn khai báo các biến của bạn khi sử dụng Perl.

Hy vọng điều này sẽ hữu ích.

3

Toán tử dấu hai chấm :: là dấu tách được sử dụng để thêm tiền tố cho thành viên của gói, mô-đun hoặc lớp với gói, mô-đun hoặc lớp mà thành viên là biểu mẫu (để phân biệt giữa các phương thức có tên tương tự trong các vùng chứa khác nhau) . Bạn có thể truy cập this page để biết thêm thông tin.

12

Đây là các bộ tách gói. Tôi nghi ngờ mã thực tế giống như $SomePackage::SomeHash{'SomeKey'}. Cú pháp này cho phép truy cập vào một "biến gói", trong trường hợp này là một băm, từ một số gói khác, hoặc bằng tên đầy đủ của nó. Bạn có lẽ quen với việc nhìn thấy một cái gì đó như:

package SomePackage; 
our %SomeHash; 
$SomeHash{'SomeKey'} # do something with $SomePackage::SomeHash{'SomeKey'} here 

Một trường hợp sử dụng là thiết lập một số mô-đun, như nói Data::Dumper, trong đó sử dụng các biến này gói để kiểm soát đầu ra:

use Data::Dumper; 
local $Data::Dumper::Sortkeys = 1; 
print Dumper { c => 3, a => 1, b => 2 }; 

... mặc dù loại sử dụng này thường được tránh bằng cách sử dụng kiểu hướng đối tượng.

Xem thêm: nổi tiếng "Đối phó với phạm trù" bài báo của MJD: http://perl.plover.com/FAQs/Namespaces.html

+0

Hơi mơ hồ và không được khuyến cáo sử dụng thực tế ... bạn có thể instsead sử dụng một ký tự dấu ngoặc kép (') thay cho hai ký tự dấu hai chấm (:) cho cùng một mục đích. (Mà sinh ra những thứ như Acme :: Don't library). – runrig

+0

@runrig, mặc dù tôi đề cập đến điều đó, nhưng nó không được chấp nhận là IIRC. Không sử dụng nó. '::' là Con đường (TM). –

2

Nó không phải bất cứ điều gì trên riêng của mình. SomePackage::SomeHash nói chung là một số nhận dạng. $someVariable::QUERY{'someString'} đề cập đến phần tử băm someString của hàm băm %someVariable::QUERY. Hash %someVariable::QUERY là tên đầy đủ của hàm băm %QUERY trong gói someVariable.

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