Il seguente script:
#!/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";
Uscite:
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()'"
Quindi, se *main::foo = *main::bar;
non fa la stessa cosa che $main::{foo} = $main::{bar};
, io sono in perdita su come rilevare un pratico differenza. ;) Tuttavia, dal punto di vista della sintassi, potrebbero esserci situazioni in cui è più semplice utilizzare un metodo rispetto ad un altro. ... si applicano sempre i soliti avvertimenti su come muoversi nella tabella dei simboli.
Sono curioso di cosa ha portato questo. :) –
Il primo causa un errore quando è abilitato il rigoroso 'subs' o strict, quest'ultimo è permesso. – MkV
Stavo scrivendo un ciclo per creare alias alcuni nomi di metodi e ho iniziato a chiedermi perché scrivo sempre '{no strict 'refs'; * {'some :: pkg'. $ new} = * {'some :: pkg'. $ old} 'quando' $ some :: pkg :: {$ new} = $ some :: pkg :: {$ old } 'funzionerebbe altrettanto bene. Intuitivamente sembrano uguali, ma cose come legature/sovraccarichi/altre magie potrebbero avere conseguenze "interessanti" se gestiscono la copia in modo diverso, sia come bug che come comportamento previsto. –