我在任何地方都找不到 :: 在 Perl 中的用途。例子:
$someVariable::QUERY{'someString'};
谢谢!
这些是包分隔符。我怀疑实际的代码更像$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
它包含在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 时声明你的变量。
希望这可以帮助。
双冒号运算符::
是用于在包、模块或类的成员前面加上该成员所构成的包、模块或类的分隔符(以区分不同容器中类似命名的方法)。您可以访问此页面以获取更多信息。
它本身不是什么。SomePackage::SomeHash
作为一个整体是一个标识符。$someVariable::QUERY{'someString'}
指散列someString
的散列元素%someVariable::QUERY
。散列是包%someVariable::QUERY
中散列的全称。%QUERY
someVariable