in reply to Code and Process Efficency

I think you've cut this a little too deep for publication. There is a disagreement between open and diamond about the name of the filehandle. Furthermore, open is missing its third argument. Your example dies from syntax error. Aside from that, your code could be paraphrased as

{ local $/; open my $first_child, '-|', $cmd and $lines = <$first_child>; or do { # forky stuff } }
If you get multiple children, it is because the open call fails.

Check whether each child uses huge hashes or arrays. Memory pressure is the likeliest cause of noticible slowdowns. Often, the cure is to rewrite the input handling.

After Compline,
Zaxo

Replies are listed 'Best First'.
Re: Re: Code and Process Efficency
by edan (Curate) on Dec 30, 2003 at 06:15 UTC

    open is not missing its third argument - the 2-argument form is perfectly valid syntax. It is usually used when you want to have more control over how the command is executed, e.g. using exec. From the perldoc:

    If you open a pipe on the command "'-'", i.e., either "'|-'" or "'-|'" with 2-arguments (or 1-argument) form of open(), then there is an implicit fork done, and the return value of open is the pid of the child within the parent process, and "0" within the child process.

    ... and taking the (slightly modified) example from perlipc:

    $pid = open(KID_TO_READ, "-|") or die "fork: $!"; if ($pid) { # parent while (<KID_TO_READ>) { # do something interesting } close(KID_TO_READ) or warn "kid exited $?"; } else { # child exec($program, @args) or die "can't exec program: $!"; # NOTREACHED }

    --
    3dan