Ogni volta che voglio simulare input e output ad un filehandle, io uso spesso riferimenti a DATA
e STDOUT
rispettivamente:Differenza tra * DATA e * DATI
use strict;
use warnings;
use autodie;
#open my $infh, '<', 'infile.txt';
my $infh = \*DATA;
#open my $outfh, '>', 'outfile.txt';
my $outfh, \*STDOUT;
print $outfh <$infh>;
__DATA__
Hello World
Uscite:
Hello World
Tuttavia, in un recent answer di Borodin, è stato dimostrato che in realtà non è necessario prendere un riferimento. Invece, un'assegnazione semplice è sufficiente:
my $infh = *DATA;
pertanto creato il seguente script a confrontare la differenza tra questi due metodi:
use strict;
use warnings;
use Fcntl qw(:seek);
# Compare Indirect Filehandle Notation
my %hash = (
'\*DATA' => \*DATA,
'*DATA' => *DATA,
);
my $pos = tell DATA;
my $fmt = "%-8s %-22s %-7s %s\n";
printf $fmt, qw(Name Value ref() readline());
while (my ($name, $fh) = each %hash) {
seek($fh, $pos, SEEK_SET); # Rewind FH
chomp(my $line = <$fh>);
printf $fmt, $name, $fh, ref($fh), $line;
}
__DATA__
Hello World
Uscite:
Name Value ref() readline()
\*DATA GLOB(0x7fdc43027e70) GLOB Hello World
*DATA *main::DATA Hello World
Quando viene a passare e leggere dal filehandle, non appare alcuna differenza tra un typeglob e un riferimento a un typeglob.
passaggio da test per la forma di ricerca di ricerca rivela seguenti pagine perldoc:
Il primo riferimento suggerisce o utilizzo. Mentre il secondo fornisce una lista di altre alternative, ma menziona come la notazione di riferimento è necessaria se vogliamo benedire la variabile. Non viene suggerita alcuna altra differenza.
C'è una differenza di stile funzionale o preferita questi due filehandle indiretti?
my $fh = \*DATA;
my $fh = *DATA;
La mia reazione immediata è che ogni personaggio in più aggiunge quel po 'di potenziale in più per la confusione da qualche parte lungo la strada ... – abiessu
molti posti accettano anche un ioref ('* DATA {IO}') – ysth
@abiessu, direi che essere incoerente con ciò che apre i miei ritorni $ fh è in realtà più probabile che causi confusione. – ikegami