trochee: (amused)
[personal profile] trochee

non-geeks, avert thine eyes.

I just had to rant somewhere about a very bad paragraph of perl:

opendir (DIR, $dir) || die "cannot open $dir\n";
while ($_ = readdir(DIR))
{
    if(/^foo/){;}       #OK
    else{next;}

   if(/^bar/){next;}   # skip bar data
   print STDERR "$_ ";
   `csh -c "cat $dir/$_/* | $pipethrough >> $dir/temporary"`;
}
`csh -c "cat  $dir/temporary | anonymize > $output"`;
print STDERR "\nDone\n";
closedir(DIR);
`rm $dir/temporary`;
exit;
# more code here...

Augh. I'll rewrite this when I have time.

Bonus question: How many processes are started by the following?

`csh -c "cat  $dir/temporary | anonymize > $output"`;

Here's my rewrite:
opendir (DIR, $dir) or die "cannot open $dir: $!\n";
while ($_ = readdir <DIR>)
{
   next unless /^foo/; # must begin with foo
   next if /^bar/;     # skip beginning with bar

   warn "$_\n";
   `cat $dir/$_/* | $pipethrough >> $dir/temporary`;
}
`anonymize < $dir/temporary > $output`;
warn "\nDone\n";

closedir(DIR) or die "couldn't close directory $dir: $!\n";
unlink($dir/temporary) or warn "couldn't unlink $dir/temporary: $!\n";

off topic...

Date: 2003-10-24 12:20 am (UTC)
ext_8724: (Default)
From: [identity profile] chr0me-kitten.livejournal.com
nice picture!

Re: off topic...

Date: 2003-10-24 01:22 am (UTC)
From: [identity profile] trochee.livejournal.com
thankyew! Comes from my trip to Baltimore early this summer for NAACL/HLT.

augh!

Date: 2003-10-24 12:35 am (UTC)
ext_183001: openvein spiral, white on black. (Default)
From: [identity profile] lx.livejournal.com
Haha. I love Perl, but often hate Perl programmers. :)

Attempt at answer to bonus question: 1 proc for csh invocation, 1 proc for cat, and 1 for the anonymize. So three additional processes to add to the Perl process? Or am I missing something?

Re: augh!

Date: 2003-10-24 12:53 am (UTC)
From: [identity profile] trochee.livejournal.com

yup, I think you missed one.

`csh -c "cat  $dir/temporary | anonymize > $output"`;
  1. Perl starts a process to handle backticks.
  2. The backtick-ed shell starts csh (let's not even talk about why csh is evil).
  3. cat does indeed require its own process.
  4. As does anonymize.
  5. And then, there's the Perl program itself
making a total of five by my count. The whole thing could have been done like so:
`anonymize < $dir/temporary > output`
For a total cost of three processes and much less brain-gnawing punctuation

Re: augh!

Date: 2003-10-24 04:51 am (UTC)
ext_183001: openvein spiral, white on black. (Default)
From: [identity profile] lx.livejournal.com
Oh! You know, it occurred to me that the backtick (qx) might invoke its own process but I tested that it didn't when using bash as the shell rather than csh using the $$ pid sequence. I guess I assumed it would be the same with csh, but I get very different results. With bash:

#!/usr/bin/perl

print "my PID is $$\n";
print `bash -c "./test2.pl"`
test2.pl just outputs its own pid, and I consistently got a pid one off of the initial pid, like so:

$ ./test.pl
my PID is 21729
my PID is 21730
So it seemed that the bash component of the qx() wasn't invoking its own process, since it would have to get a pid before test2.pl did, but the numbers are sequential. However, doing it with csh I got:

$ ./test.pl
my PID is 21746
my PID is 21767
Somehow these two scripts are 21 process increments apart. It's not clear to me how that's happening. Do you know, am I misreading something here, is my testing procedure flawed, or is the csh call actually somehow grabbing 21 processes (or causing the OS to skip 21 pids?). I ran it repeatedly and each time I get a skip of 21 pids between test.pl and test2.pl.

Weird.

Re: augh!

Date: 2003-10-24 06:05 am (UTC)
From: [identity profile] trochee.livejournal.com
csh is so broken that it wouldn't surprise me if it needed 21 pids just to patch bugs:

http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/

Re: augh!

Date: 2003-10-24 06:54 am (UTC)
ext_183001: openvein spiral, white on black. (Default)
From: [identity profile] lx.livejournal.com
Haha, thanks for the link. I've never actually even seen csh in active use (though I have seen the ostensibly fixed tcsh on MacOS X as the default shell), now I'll know to avoid it with good reason. ;)

Of course, if the 21 pid thing is really csh, that amounts to something like 25 additional procs to this script for each invocation of that system call! :) Woooo.

Profile

trochee: (Default)
trochee

June 2016

S M T W T F S
   1234
567 89 1011
12131415 161718
19202122232425
2627282930  

Most Popular Tags

Style Credit

Expand Cut Tags

No cut tags
Page generated Dec. 30th, 2025 03:39 pm
Powered by Dreamwidth Studios