Обновление: Проблема различения переменной, которая может быть назначена глобусам *DATA
или *STDIN
, - это задание для fileno
:
sub data_or_stdin {
my $x = shift;
if (fileno($x) == fileno(DATA)) {
return "DATA";
} elsif (fileno($x) == fileno(STDIN)) {
return "STDIN";
} else {
return "NEITHER";
}
}
print "DATA: ", data_or_stdin(*DATA), "\n";
print "STDIN: ", data_or_stdin(*STDIN), "\n";
open(ZZZ, ">>", "zzz"); close ZZZ;
open(ZZZ, "<", "zzz"); print "ZZZ: ", data_or_stdin(*ZZZ), "\n"; close ZZZ;
open($fh, "<", "zzz"); print "\$fh=ZZZ: ", data_or_stdin($fh), "\n"; close $fh;
$fh = *DATA; print "\$fh=DATA: ", data_or_stdin($fh), "\n";
$fh = *STDIN; print "\$fh=STDIN: ", data_or_stdin($fh), "\n";
__END__
stuff;
$ perl data_or_stdin.pl
DATA: DATA
STDIN: DATA
ZZZ: NEITHER
$fh=ZZZ: NEITHER
$fh=DATA: DATA
$fh=STDIN: DATA
Если $f
- файловый дескриптор, то ref $f
или ref \$f
будет "GLOB"
Если $f
является скаляром, то ref \$f
будет "SCALAR"
.
sub filehandle_or_scalar {
my $x = shift;
if (ref $x eq "GLOB" || ref \$x eq "GLOB") {
return "filehandle";
} elsif (ref \$x eq "SCALAR") {
return "scalar";
} else {
return "not filehandle or scalar";
}
}
print "STDIN: ", filehandle_or_scalar(*STDIN), "\n";
print "\$_: ", filehandle_or_scalar($_), "\n";
open($fh, ">", "zzz");
print "\$fh: ", filehandle_or_scalar($fh), "\n";
print "string: ", filehandle_or_scalar('file.txt'), "\n";
print "ref: ", filehandle_or_scalar(\$x), "\n"
###########################################
$ perl filehandle_or_scalar.pl
STDIN: filehandle
$_: scalar
$fh: filehandle
string: scalar
ref: not filehandle or scalar