David Wall wrote:

> 
> 
> --On Saturday, September 06, 2003 7:45 PM -0400 perlwannabe
> <[EMAIL PROTECTED]> wrote:
> 
>> OK, I have a new problem.  I need to delete an entire line that contains
>> certain text.  I have done an extensive search and had no luck finding an
>> adequate answer.  Yes, I also saw the FAQ that just refers me to
>> Tie::file.  The most promising solution was:
>>
>> perl -ni.bak -e 'print unless /FOO/;' input.txt
>>
>> but when I run that line from the c:\ I get the following error:
>>
>> Can't find string terminator "'" anywhere before EOF at -e line 1.
> 
> Windows is weird that way.  Use double-quotes instead of single-quotes.
> 
> 
>> Also, I would like to run this from within a script instead of from the
>> command line.
>>
>> BTW...using PERL 5.8.0 on Windows2000 Pro
> 
> Take a look at 'perldoc perlrun' -- it explains how all the command-line
> options work and give equivalent code.

Perlfaq5 also has a nice tidbit on how to do this while within a script. 

I used this trick recently to do some updates to an existing website where I
needed to move a bunch of images from the main html/ directory to a
subfolder html/images/ *provided* that the images were actually used in the
existing html files; otherwise they should be skipped and left in the dir
so I can move them elsewhere manually.

here's the code I wound up using. Hopefully you'll find this a useful
example. I've commented the code to make things more obvious.


#!/usr/bin/perl
use warnings;
use strict;
$|++;

use File::Glob;
# make these operations fatal if they fail
use Fatal qw( chdir open close rename );
# go here, and scan for jpg images that don't belong here.
chdir "/home/webdragon/webclient/bigbronze/html";
my @jpegfiles = glob( q{*.jpg} );

foreach my $jpegfile (sort @jpegfiles)
{
# find every file that contains the image as a src="filename.jpg"
        chomp(my @htmlfiles = qx{grep -l 'src="$jpegfile"' *});
# skip it if we couldn't find any html files referencing this image.
        unless (@htmlfiles)
        {
                print "$jpegfile was not found in any other file\n\n";
                next;
        }
# tell us about it
        print "$jpegfile was found in: @htmlfiles\n";
# quote the expression for the document replacement so we don't 
# have to do this multiple times
        my $regex = qr{\Qsrc="$jpegfile"};
# wrap the local magic in a block to keep the scoping sensible
        {       
# set a local -i.bak and file list 
# just as if we passed this on a command line to a 
# (perl -pi -e '#code here' filename filename2 filename3) one-liner
# this deep magic lets us edit the files in-place from within this script.
                local ($^I, @ARGV) = ('', @htmlfiles);
# more magic with @ARGV
                while (<>)
                {
# fix the newline for foreign files as long as we're here
                        s#\015\012|\015|\012#\n#;
# fix our image location to the subdirectory where we really want them
                        s#$regex#src="images/$jpegfile"#;
                
                        print;
# resets $. using yet more ARGV filehandle magic. nifty trick, this.
                        close ARGV if eof;
                }
                print " -- edited @htmlfiles\n";
        }
# move the image too! 
        rename "$jpegfile", "images/$jpegfile";
        print " -- moved $jpegfile to images/\n\n";
}

__END__

now, you'll note that here I used -i rather than -i.bak since with 900 of
these images referencing 250 html files, you wind up with
blah.htm.bak.bak.bak.bak or blah.htm.~.~.~.~.~.~ and swiftly hit a filename
size limitation in your OS after a very short bit. so I used a few 'last'
statements to test it on ONE file, and then removed the backup stuff and
had it run in-place with $^I set to '' instead. 

HTH!

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

Reply via email to