7

Perl での :: の意味はどこにもありません。例:

$someVariable::QUERY{'someString'};

ありがとう!

4

4 に答える 4

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;

何が起こったのかというと、両方のプログラムが同じ variable を使用しているということです$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 $fooand notを宣言したことに気付くでしょうmy $foo。これは、パッケージ変数が格納されourている Perl シンボル テーブルに変数を配置するためです。これはレキシカル スコープの宣言であり、現在は推奨されています。で宣言された変数は、宣言されたスコープ内にのみ存在し、ファイルの外にあることはできません。mymy

たぶん、これは変数を宣言するのを忘れたときに表示されるエラーメッセージに光を当てるでしょうmy:

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

デフォルトでは、すべての Perl 変数はパッケージ変数です (つまり、Perl のシンボル テーブルにあります)。use strictプラグマは、パッケージ変数を宣言するか、our変数の完全なパッケージ名を使用することを強制します。my(99 40/100% の確率で) で変数を宣言し、 を使用するstrictことで、Perl を使用するときに変数を宣言する必要があります。

お役に立てれば。

于 2013-06-13T21:01:01.263 に答える
2

それ自体は何もありません。SomePackage::SomeHash全体として識別子です。$someVariable::QUERY{'someString'}hash のハッシュ要素someStringを参照し%someVariable::QUERYます。Hashは、パッケージ内%someVariable::QUERYのハッシュの完全な名前です。%QUERYsomeVariable

于 2013-06-13T20:13:25.567 に答える