簡體   English   中英

在 Perl 中,直接全局混疊和通過 stash 混疊之間有什么區別嗎?

[英]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)”

https://github.com/perl/perl5/issues/10625

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM