在Perl中,以下两个结构之间是否存在任何差异:
*main::foo = *main::bar
和
$main::{foo} = $main::{bar}
它们似乎具有相同的功能(将*main::foo
中的所有插槽别名归结为*main::bar
中定义的那些插槽),但我只是想知道这种等效性是否始终成立。
答案 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全局)”