7

我在任何地方都找不到 :: 在 Perl 中的用途。例子:

$someVariable::QUERY{'someString'};

谢谢!

4

4 回答 4

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 著名的“Coping with Scopeing”文章:http: //perl.plover.com/FAQs/Namespaces.html

于 2013-06-13T19:36:33.930 回答
7

它包含在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但是,当我运行我的程序时,我得到:

$ ./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 符号表中。这my是一个词法范围的声明,现在是首选。声明的变量my仅存在于其声明的范围内,并且不能位于其所在文件之外。

当您忘记用以下方式声明变量时,也许这将阐明您收到的错误消息my

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

默认情况下,所有 Perl 变量都是变量(也就是说,它们在 Perl 的符号表中)。pragma 强制您使用use strict变量声明包变量our或强制您使用变量的完整包名。通过声明一个变量 with my(就像我们在 99 40/100% 的时间里做的那样)和 using strict,我们强制你在使用 Perl 时声明你的变量。

希望这可以帮助。

于 2013-06-13T21:01:01.263 回答
3

双冒号运算符::是用于在包、模块或类的成员前面加上该成员所构成的包、模块或类的分隔符(以区分不同容器中类似命名的方法)。您可以访问此页面以获取更多信息。

于 2013-06-13T19:36:19.067 回答
2

它本身不是什么。SomePackage::SomeHash作为一个整体是一个标识符。$someVariable::QUERY{'someString'}指散列someString的散列元素%someVariable::QUERY。散列是包%someVariable::QUERY中散列的全称。%QUERYsomeVariable

于 2013-06-13T20:13:25.567 回答