在Perl中,直接全局别名和通过存储的别名之间有什么区别吗?

时间:2011-07-06 21:36:54

标签: perl alias typeglob perl-stash

在Perl中,以下两个结构之间是否存在任何差异:

*main::foo = *main::bar

$main::{foo} = $main::{bar}

它们似乎具有相同的功能(将*main::foo中的所有插槽别名归结为*main::bar中定义的那些插槽),但我只是想知道这种等效性是否始终成立。

4 个答案:

答案 0 :(得分:9)

也许不是你想要的那种差异,但*main::foo$main::{foo}之间有两个很大的区别;前者在编译时在存储中查找glob,在必要时创建它,而后者在运行时查找存储中的glob,并且不会创建它。

这可能会对藏匿中的任何其他内容产生影响,它肯定会影响您是否收到used only once警告。

答案 1 :(得分:3)

以下脚本:

#!/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};的行为不同,我就不知道如何检测实际差异。 ;)但是,从语法的角度来看,可能存在使用一种方法而不是另一种方法更容易的情况。 ......关于在符号表中乱窜的常见警告总是适用。

答案 2 :(得分:3)

使用$A::{foo} = $obj访问存储区时,您可以在符号表上放置任何内容,*A::foo = $obj根据$obj类型将$obj放置在typeglob的预期广告位上。< / p>

例如:

  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

答案 3 :(得分:0)

另请参阅“标量vs全局(* {}不应返回FAKE全局)”

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