Perl语法字符"::"

mob*_*oby 7 syntax perl

我找不到Perl中的:: is for.例:

$someVariable::QUERY{'someString'};
Run Code Online (Sandbox Code Playgroud)

谢谢!

Joe*_*ger 12

这些是包分隔符.我怀疑实际代码更像$SomePackage::SomeHash{'SomeKey'}.此语法允许从一些其他包或其完全限定名访问"包变量",在这种情况下是哈希.你可能更习惯于看到类似的东西:

package SomePackage; 
our %SomeHash; 
$SomeHash{'SomeKey'} # do something with $SomePackage::SomeHash{'SomeKey'} here
Run Code Online (Sandbox Code Playgroud)

一个用例是设置一些模块,比如Data :: Dumper,它使用这些包变量来控制输出:

use Data::Dumper;
local $Data::Dumper::Sortkeys = 1;
print Dumper { c => 3, a => 1, b => 2 };
Run Code Online (Sandbox Code Playgroud)

...虽然通常使用面向对象的样式来避免这种用法.

另见:MJD着名的"应对范围"文章:http://perl.plover.com/FAQs/Namespaces.html


Dav*_* W. 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;
Run Code Online (Sandbox Code Playgroud)

我设置$foo酒吧,从未碰过它.应该打印bar但是,当我运行我的程序时,我得到:

$ ./test.pl
WOO WOO! I MESSED WITH FOO!
Run Code Online (Sandbox Code Playgroud)

test2.pl,我有:

sub futz_with_foo {
    $foo = "WOO WOO! I MESSED WITH FOO!"
}
1;
Run Code Online (Sandbox Code Playgroud)

发生的事情是两个程序都使用相同的变量$foo.为了解决这个问题,Perl为模块提供了拥有自己的命名空间的能力.原始语法是单引号,但::在Perl 4中更改为(如果我没记错的话).您仍然可以使用单引号.您使用声明您的命名空间.

理解这一点的最好方法是看它在行动.请尝试以下方法:

#! /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;
Run Code Online (Sandbox Code Playgroud)

运行这个,我得到:

$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
Run Code Online (Sandbox Code Playgroud)

默认情况下,程序从主命名空间开始.顺便说一句,你会注意到我宣布our $foo而不是my $foo.那是因为our将变量放在Perl符号表中,其中存储了变量.这my是一个词法范围的声明,现在是首选.声明的变量my仅存在于其声明的作用域中,并且不能位于文件的外部.

也许这会对您在忘记使用以下内容声明变量时获得的错误消息有所了解my:

Global symbol "$foo" requires explicit package name at ...
Run Code Online (Sandbox Code Playgroud)

默认情况下,所有Perl变量都是Package变量(也就是说,它们位于Perl的符号表中).该use strictpragma强制您使用或声明包变量our或强制您使用该变量的完整包名.通过声明一个变量my(就像我们99/100/100%的时间)并通过使用strict,我们强制您在使用Perl时声明您的变量.

希望这可以帮助.