我找不到Perl中的::是什么意思。例如:
$someVariable::QUERY{'someString'};
谢谢!
答案 0 :(得分:12)
这些是包分隔符。我怀疑实际代码更像是$SomePackage::SomeHash{'SomeKey'}
。此语法允许从某个其他包或其完全限定名称访问“包变量”,在本例中为哈希。你可能更习惯于看到类似的东西:
package SomePackage;
our %SomeHash;
$SomeHash{'SomeKey'} # do something with $SomePackage::SomeHash{'SomeKey'} here
一个用例是设置一些模块,比如说Data::Dumper,它使用这些包变量来控制输出:
use Data::Dumper;
local $Data::Dumper::Sortkeys = 1;
print Dumper { c => 3, a => 1, b => 2 };
...虽然通常使用面向对象的样式来避免这种用法。
另见:MJD着名的“应对范围”一文:http://perl.plover.com/FAQs/Namespaces.html
答案 1 :(得分:6)
Perlmod涵盖了这一点。
::
实际上是名称空间标识符。在早期的Perl中,在这个命名空间的概念出现之前,你可能会在你的程序中发生变量名称冲突:
这是我的计划:
#! /usr/bin/env perl
#use strict;
use warnings;
use feature qw(say);
require "test2.pl";
$foo = "bar";
futz_with_foo();
say $foo;
我将$foo
设置为 bar 并且从未触及过它。应该打印bar
然而,当我运行我的程序时,我得到:
$ ./test.pl
WOO WOO! I MESSED WITH FOO!
在test2.pl
中,我有:
sub futz_with_foo {
$foo = "WOO WOO! I MESSED WITH FOO!"
}
1;
两个程序都使用相同的变量$foo
。为了解决这个问题,Perl为模块提供了拥有自己的命名空间的能力。原始语法是单引号,但在Perl 4中更改为::
(如果我没记错的话)。您仍然可以使用单引号。使用package声明您的命名空间。
理解这一点的最好方法是看它的实际效果。请尝试以下方法:
#! /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;
运行这个,我得到:
$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
默认情况下,您的程序从主命名空间开始。顺便说一下,你会注意到我宣布our $foo
而不是my $foo
。那是因为our
将变量放在Perl符号表中,其中存储了 package 变量。 my
是一个词法范围的声明,现在是首选。使用my
声明的变量仅存在于其声明的范围内,并且不能位于其所在的文件之外。
当您忘记使用my
声明变量时,这可能会对您收到的错误消息有所了解:
Global symbol "$foo" requires explicit package name at ...
默认情况下,所有Perl变量都是 Package 变量(也就是说,它们位于Perl的符号表中)。 use strict
pragma强制您使用our
声明包变量,或强制您使用变量的完整包名。通过使用my
声明变量(就像我们在99%/ 100%的情况下一样)并使用strict
,我们强制您在使用Perl时声明变量。
希望这有帮助。
答案 2 :(得分:3)
双冒号运算符::
是用于为包,模块或类的成员添加前缀的分隔符,其中包含成员所形成的包,模块或类(以区分类似命名的方法)不同的容器)。您可以访问this page了解详情。
答案 3 :(得分:2)
它本身并不是什么。 SomePackage::SomeHash
整体上是一个标识符。 $someVariable::QUERY{'someString'}
指散列someString
的散列元素%someVariable::QUERY
。哈希%someVariable::QUERY
是包%QUERY
中哈希someVariable
的全名。