Perl语法字符“::”

时间:2013-06-13 19:32:16

标签: perl syntax

我找不到Perl中的::是什么意思。例如:

$someVariable::QUERY{'someString'};

谢谢!

4 个答案:

答案 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的全名。