mandog has asked for the wisdom of the Perl Monks concerning the following question:

Below is a trivial script I wrote to crawl through our web site, find the .LCK files that dreamweaver uses to mark files as "checked out" and produce a simple report of who has what checked out.

My question is:
"Am I bad person for mixing shell and perl this way?"

If I'd stopped to re-learn the syntax for File::Find, I think I'd still be writing this script... On the other hand, maybe some day I want to hand this off to somebody that doesn't like shell ? on Win32???

!/usr/local/bin/perl -w use strict; my @files=`find /home/sites/lctc/doc_root -name *.LCK`; my %users; foreach my $file (@files){ my $key=`cat $file`; chomp($key); $users{$key}.="\t$file"; } foreach my $key (sort(keys %users)) { print "$key \n $users{$key}\n\n"; } # output Kourtney (kourtney)||kourtney@ltc.org /home/sites/lctc/doc_root/go/donate/index.shtml.LCK [...] many red dot HD (toc)||toconnr@hotmail.com (blame tim) /home/sites/lctc/doc_root/go/jobs/index.shtml.LCK


email: mandog

Replies are listed 'Best First'.
Re: mixing perl & shell style & speed
by dws (Chancellor) on Feb 07, 2002 at 06:03 UTC
    Am I bad person for mixing shell and perl this way?

    Nah. But quicky scripts have a way of escaping into the wild, where people become dependent on them and howl when they break. That's one reason to do more in Perl.

    Consider changing     my $key=`cat $file`; into

    open(K, "<$file") or die "$file: $!\n"; my $key = do { local $/; <K> }; close(K); chomp($key);
    Doing it all in Perl protects against someone having a cat in an unexpected place in their PATH.

Re: mixing perl & shell style & speed
by runrig (Abbot) on Feb 07, 2002 at 06:15 UTC
    Another option (File::Find really isn't that hard):
    use File::Find; my %users; find(sub { return unless -f and /\.LCK$/; local @ARGV = ($file); my ($key) = <>; chomp $key; $users{$key} .= "\t$file"; }, qw(/home/sites/lctc/doc_root))
    You should realize how this 'reading in the whole file' differs from the above solution, and how it doesn't really matter which way its done in this case, except if there are read problems (e.g. read permission or file no longer exists, which is possible - you get the file name then someone releases the lock before you read the lock file) on some of the files.