David <[EMAIL PROTECTED]> wrote:
> Steve Grazzini wrote:
>>
>> And besides, open() is not particularly easy to
>> override.  You'd have to account for all of:
>> 
>>   open FH, $path;
>>   open FH, "> $path";
>>   open FH, ">", $path;
>>   open FH, ">", \$sstream;
>>   open FH, "command |";
>>   open FH, "| command";
> 
> i don't recommand people do all of the above. if 
> the need arise to access the open() function that 
> came with Perl, CORE::open() is good enough.

Right -- you don't want to implement open(), just
validate the arguments before calling the builtin.

But there are still two issues.

1) Before validating a path, you have to determine
   whether you've been passed one, since several 
   standard forms of open() don't open a regular 
   file at all.

   I left out a few of these:

     open FH, "<&stdin";  # dup STDIN
     open FH, "<&0";      # ditto
     open FH, "-";        # ditto
     open FH, "|-";       # fork + pipe

   And I've probably *still* forgotten others.

2) You can't break the semantics of the builtin.

   This means you have to turn the first argument
   (a string, a globref, an undefined scalar, etc) 
   into a filehandle.  And then you need to call
   the builtin with the correct number and type of
   arguments.

   This is also trickier than it appears on first 
   blush.  Look what happens when you try:

     use subs qw/open/;
     sub open { CORE::open(@_) }

     open IN, $0  or die "open: '$0': $!\n";
     print while <IN>;


Anyway there's a lot to learn in IPC/Open3.pm
if the OP really wants to do this.

-- 
Steve

perldoc -qa.j | perl -lpe '($_)=m("(.*)")'

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to