[英]In Perl, is there any difference between direct glob aliasing and aliasing via the stash?
在 Perl 中,以下兩個構造之間是否有任何區別:
*main::foo = *main::bar
和
$main::{foo} = $main::{bar}
它們似乎具有相同的 function (將*main::foo
中的所有插槽別名為*main::bar
中定義的插槽),但我只是想知道這種等效性是否始終成立。
也許不是您要尋找的那種差異,但是*main::foo
和$main::{foo}
之間有兩個很大的不同; 前者在編譯時在 stash 中查找 glob,如有必要則創建它,而后者在運行時在 stash 中查找 glob,並且不會創建它。
這可能會對隱藏中的任何其他內容產生影響,並且它肯定會影響您是否收到used only once
的警告。
以下腳本:
#!/usr/bin/env perl
#mytest.pl
no warnings;
$bar = "this";
@bar = qw/ 1 2 3 4 5 /;
%bar = qw/ key value /;
open bar, '<', 'mytest.pl' or die $!;
sub bar {
return "Sub defined as 'bar()'";
}
$main::{foo} = $main::{bar};
print "The scalar \$foo holds $foo\n";
print "The array \@foo holds @foo\n";
print "The hash \%foo holds ", %foo, "\n";
my $line = <foo>;
print "The filehandle 'foo' is reads ", $line;
print 'The function foo() replies "', foo(), "\"\n";
輸出:
The scalar $foo holds this
The array @foo holds 1 2 3 4 5
The hash %foo holds keyvalue
The filehandle 'foo' is reads #!/usr/bin/env perl
The function foo() replies "Sub defined as 'bar()'"
所以如果*main::foo = *main::bar;
不做與$main::{foo} = $main::{bar};
相同的事情 ,我不知道如何檢測實際差異。 ;) 但是,從語法的角度來看,可能存在使用一種方法比使用另一種方法更容易的情況。 ...關於在符號表中亂七八糟的常見警告始終適用。
以$A::{foo} = $obj
訪問存儲允許您在符號表上放置任何內容,而*A::foo = $obj
根據$obj
類型將$obj
放置在 typeglob 的預期槽上。
例如:
DB<1> $ST::{foo} = [1,2,3]
DB<2> *ST::bar = [1,2,3]
DB<3> x @ST::foo
Cannot convert a reference to ARRAY to typeglob at (eval 7)[/usr/local/perl/blead-debug/lib/5.15.0/perl5db.pl:646] line 2.
at (eval 7)[/usr/local/perl/blead-debug/lib/5.15.0/perl5db.pl:646] line 2
eval '($@, $!, $^E, $,, $/, $\\, $^W) = @saved;package main; $^D = $^D | $DB::db_stop;
@ST::foo;
;' called at /usr/local/perl/blead-debug/lib/5.15.0/perl5db.pl line 646
DB::eval called at /usr/local/perl/blead-debug/lib/5.15.0/perl5db.pl line 3442
DB::DB called at -e line 1
DB<4> x @ST::bar
0 1
1 2
2 3
DB<5> x \%ST::
0 HASH(0x1d55810)
'bar' => *ST::bar
'foo' => ARRAY(0x1923e30)
0 1
1 2
2 3
另請參閱“標量與 glob(*{} 不應返回 FAKE glob)”
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.