On Tue, 2004-04-20 at 13:55, Larry Wall wrote:
> Okay, let's put this one to rest. 

Good, and I'll not try to speak ill of the dead thread, so ignoring hash
and/or array access, let me respond to the end of your message.

> As for C<qx//>, it probably needs to be completely rethought anyway,
> along with C<system>.  Perhaps both will be subsumed under a C<run>
> function of some sort.  But that's for a future Apocalypse.

Now, you had to go and do it didn'cha? ;-)

I've been thinking about this for a long time, but for other reasons.

It seems to me that there are dozens of ways to run a program from
within Perl 5. Some are simple, some ugly as sin (sorry, I mean
"complex"), but given A12, I think we can start to home in on a great
deal of the standard tools.

In specific, here is a proposal for execution:

        multi run(string $command) returns(Process) {...} # Funky shell default
        multi run(Process $process) returns(Process) {...} # Relies on $process.cmdline
        multi run(Program $program, IO::Mode $mode=undef) returns(Process) {...}
        
which gives us our process control, all nicely bottled up:

        my Process $p = run("find / -name null");
        say "Spawned find $($p.getpid)";
        $p.kill('TERM');

But if you don't want that, you can always:

        run("find / -name null").wait;

which might have an alias called "system".

And if you provide mode:

        my Process $p = run(program=>"find / -name null", mode=>"r");

Then you actually get back a:

        class ExecPipe is Process does IO::Handle {...}

which lets you do:

        say "Found null at: $p.getline";

and which could have a wrapper:

        $x = readpipe("pwd");

ahhh... simple.

open2, open3, exec and all manner of other strange things should be
simple aliases for complex run invocations.

The reason for making Program an object? Why for this:

        run(Program(path=>"find",name=>"finding null",args=>[<</ -name 
null>>],exec=>true));

which has the alias "exec".

Making this as magical as Perl 5 system would be difficult, though, and
I'm not sure you need to preserve that particular way of doing things.

I leave the definition of Program up to the imagination of the reader.

Incidentally, if Process is a standard class, and happens to do:

        class Process {
                ...
                method prefix:~() { return ~($.getpid) }
                method prefix:+() { return $.getpid }
                ...
        }

Then $$ is just a Process object, but behaves exactly as you always
expected it to.

        $$.kill("ABRT")

then does what you might expect, as does:

        say $$.cmdline;

-- 
Aaron Sherman <[EMAIL PROTECTED]>
Senior Systems Engineer and Toolsmith
"It's the sound of a satellite saying, 'get me down!'" -Shriekback


Reply via email to