Thread Ist eine Variable ein Filehandle? (4 answers)
Opened by pq at 2016-02-21 13:59

pq
 2016-02-21 13:59
#183952 #183952
User since
2003-08-04
12208 Artikel
Admin1
[Homepage]
user image
Gibt es vielleicht ein Modul, um zu prüfen, ob eine Variable ein Filehandle ist?

Wir haben gestern diesen Pull Request für CPAN:YAML::XS gemerged:
https://github.com/ingydotnet/yaml-libyaml-pm/comm...
Code: (dl )
1
2
 -    if (ref $filename eq 'GLOB') {
+ if (defined fileno($filename)) {


Unglücklicherweise stirbt fileno($var), wenn $var ein Objekt ist, was kein Filehandle ist (beispielsweise CPAN:Path::Class::File).

Nun habe ich den Code aus File::Copy kopiert:
https://github.com/perlpunk/yaml-libyaml-pm/commit...

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
sub _from_a_handle {
    my ($var) = @_;
    my $from_a_handle = (
        ref($var)
            ? (
                ref($var) eq 'GLOB'
                || UNIVERSAL::isa($var, 'GLOB' )
                || UNIVERSAL::isa($var, 'IO::Handle')
            )
            : (ref(\$var) eq 'GLOB')
    );
    return $from_a_handle;
}


Der benutzt UNIVERSAL::isa, das heisst, das funktioniert nicht, wenn die Klasse isa() überschreibt.
Das ist vermutlich ein seltener Fall, den man fixen könnte, indem man eine weitere Prüfung einbaut und dann $var->isa aufruft.
Aber mich würde interessieren, ob es mittlerweile ein Modul gibt, was solch eine Prüfung für mich macht.
Always code as if the guy who ends up maintaining your code will be a violent psychopath who knows where you live. -- Damian Conway in "Perl Best Practices"
lesen: Wiki:Wie frage ich & perlintro Wiki:brian's Leitfaden für jedes Perl-Problem

View full thread Ist eine Variable ein Filehandle?