On Jul 22, Bob H said:
>I have a script that is *supposed* to search a file and make certain
>words that I have in an array uppercase. My brain is not grokking it.
You should not use tr/// to make strings uppercase. Perl provides the
uc() function for that.
>Q1: What is wrong with my script (below)?
I'll point it out.
>Q2: Can I update a file in place?
Yes, using the $^I and @ARGV varaibles.
>Q3: How do I run multiple things against one file in one script?
Send multiple files as command-line args, and loop over the @ARGV array.
>#!/usr/bin/perl
>use strict;
>use warnings;
BRAVO! :)
># variables
>my $word = undef;
The '= undef' part is redundant.
># setup the words to uppercase
>my @words = qw/ Mary John Joe /;
>
>open FILE, ">> NEW1 " or die "can't open FILE: $!";
>
>while (<>) {
> foreach $word (@words) {
> $word = ~ tr /a-z/A-Z/;
> print FILE;
> }
A bunch of problems here.
1. you're print the same line to FILE X times, where X is the size of the
@words array
2. you're trying to modify the elements of @words, instead of $_
3. you've got a space in the middle of the =~ operator
This is quite funny, actually. Because of that space, your code appears
to capitalize the entire string and print it three (in your example)
times. Why? Because
$word = ~ tr/a-z/A-Z/;
is like
$word = ~($_ =~ tr/a-z/A-Z/);
>}
>
># close the file
>close (FILE);
Here is a multi-file in-place working solution:
#!/usr/bin/perl
use strict;
use warnings;
$^I = ".bak"; # keep a backup of the files as xxx.bak
my @words = qw( make these caps );
my $rx = join "|", map quotemeta, @words;
# $rx is 'make|these|caps'
# perl is magic
while (<>) {
s/\b($rx)\b/\U$1/ig; # "\U$1" is like uc($1)
print;
}
The regex finds the words (and they must be alone, not part of another
word) in any case and uppercases them. If there was a line in the file
these students are going on a capstone experience
it would become
THESE students are going on a capstone experience
Try it out -- it should work fine.
--
Jeff "japhy" Pinyan [EMAIL PROTECTED] http://www.pobox.com/~japhy/
RPI Acacia brother #734 http://www.perlmonks.org/ http://www.cpan.org/
** Look for "Regular Expressions in Perl" published by Manning, in 2002 **
<stu> what does y/// stand for? <tenderpuss> why, yansliterate of course.
[ I'm looking for programming work. If you like my work, let me know. ]
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]