in reply to Re: diamond operator question
in thread diamond operator question

Is there a reason why the diamond operator in Perl doesn't call readdir for directories, the same way it calls readline for regular files ?

Replies are listed 'Best First'.
Re^3: diamond operator question
by muntfish (Chaplain) on Jun 09, 2005 at 09:53 UTC

    I suppose they could have done that, but I can't comment on why they didn't. It would have to be able to detect whether it was working on a filehandle created by open or a dir handle created by opendir, but I guess that's not unreasonable.


    s^^unp(;75N=&9I<V@`ack(u,^;s|\(.+\`|"$`$'\"$&\"\)"|ee;/m.+h/&&print$&
      Excuse me for keeping asking questions about this :) but it's for my own curiosity :

      What could be the different ways to detect the kind of filehandle, to know if it was opened by open or opendir ?
      Apparently, the following quote :
      "DIRHANDLEs have their own namespace separate from FILEHANDLEs." (source)
      could help detecting whether it was opened by open or opendir.
      But when I do something like the following code to see the difference between the two namespaces, I get the same result for both of them.
      open(DIR, './random_file'); print 'open : ', *main::DIR{NAME}, ' - ', *main::DIR{PACKAGE}, "\n"; opendir (DIR, '.'); print 'opendir : ', *main::DIR{NAME}, ' - ', *main::DIR{PACKAGE}, "\n" +;
      Am I doing something wrong, or is there another way to differentiate the namespaces of the handles ?
      Or could it be the version of Perl I'm using ( 5.005 ) ?

      Thanks
Re^3: diamond operator question
by Fletch (Bishop) on Jun 09, 2005 at 13:58 UTC

    Orthagonality with the C opendir(2) and friends would be my guess. If it really mattered to you you probably could implement a tied filehandle that provided its own map from readline to readdir without too much trouble.

    Update: Yeah, not too much trouble at all.

    #!/usr/bin/perl use strict; package Tie::Dirfile; use IO::Dir (); sub TIEHANDLE { my $class = shift; my $self = {}; $self->{_dir} = shift; $self->{_handle} = IO::Dir->new( $self->{_dir} ); return bless $self, $class; } sub READLINE { return shift()->{_handle}->read; } sub CLOSE { return shift()->{_handle}->close( ); } package main; local( *DH ); tie *DH, 'Tie::Dirfile' => "/bin" or die "Can't create Tie::Dirfile for /bin: $!\n"; my $i = 0; print $i++, ": ", $_, "\n" while( <DH> ); close( DH ); exit 0; __END__

    --
    We're looking for people in ATL