develooper Front page | perl.beginners | Postings from February 2012

Re: search and replace with an array

Thread Previous | Thread Next
From:
John W. Krahn
Date:
February 20, 2012 14:32
Subject:
Re: search and replace with an array
Message ID:
4F42C9B5.1080005@shaw.ca
Chris Stinemetz wrote:
> I am trying ot find a way to use an array as a reference to remove
> lines from a file.
> The array @keyFields has the elements "rcsm and cdmno". My objective
> is to remove any line from the input that matches the regex /rcsm\d/
> and cdmno\d/.

AND means matching BOTH in the same line, but you only want to match ONE 
of the array elements so that should be "rcsm OR cdmno".


> I'm not sure if I'm using the best approach.
>
> I am getting the following error:
>
> Argument "rcsm" isn't numeric in array element at deleteData1.pl line
> 15,<DATA>  line 1.
> Argument "cdmno" isn't numeric in array element at deleteData1.pl line
> 15,<DATA>  line 1.
>
> #!/usr/bin/perl
> use warnings;
> use strict;
>
> my $file = "nonKeys.txt";
> my $newFile = "cleanKeys.txt";
> my @keyFields = qw(rcsm cdmno);
>
> #open my $FH, '<', $file or die "ERROR opening $file: !";
> open my $FHOUT, '>', $newFile or die "ERROR opening $newFile: !";
>
> while (<DATA>  ) {
>    chomp;
>    for my $i ( @keyFields ) {

$i now contains either 'rcsm' or 'cdmno'.


>      print $FHOUT $_ =~ s/$keyFields[$i]\d/match/;

Using a string as an array index will convert that string to a numeric 
value, in this case the number 0, so $keyFields[$i] will always evaluate 
to 'rcsm' as that is the first element of @keyFields.

The substitution operator will return either 1 or '' (true or false) 
which is probably not what you want.


>    }
> }
>
> __DATA__
> cdmno=1
> rdnt_cdmno=1
> cdmno2=1
> cdmno3=1
> cdmno4=1
> cdmno5=1
> cdmno6=1
> cdmno7=1
> cdmno8=1
> cdmno=2
> rcsm=801
> rcsm2=801
> rcsm3=801
> rcsm4=801
> rcsm5=801
> rcsm6=801
> rcsm7=801
> rcsm8=801
> rcsm=801
> rcsm2=801
> rcsm3=801
> rcsm4=801
> rcsm5=801
> rcsm6=801
> rcsm7=801
> rcsm8=801
> rcsm=802


$ echo "cdmno=1
rdnt_cdmno=1
cdmno2=1
cdmno3=1
cdmno4=1
cdmno5=1
cdmno6=1
cdmno7=1
cdmno8=1
cdmno=2
rcsm=801
rcsm2=801
rcsm3=801
rcsm4=801
rcsm5=801
rcsm6=801
rcsm7=801
rcsm8=801
rcsm=801
rcsm2=801
rcsm3=801
rcsm4=801
rcsm5=801
rcsm6=801
rcsm7=801
rcsm8=801
rcsm=802" | perl -e'

my @keyFields = qw/ rcsm cdmno /;

while ( my $line = <> ) {
     print $line unless grep $line =~ /$_\d/, @keyFields;
     }
'
cdmno=1
rdnt_cdmno=1
cdmno=2
rcsm=801
rcsm=801
rcsm=802




John
-- 
Any intelligent fool can make things bigger and
more complex... It takes a touch of genius -
and a lot of courage to move in the opposite
direction.                   -- Albert Einstein

Thread Previous | Thread Next


nntp.perl.org: Perl Programming lists via nntp and http.
Comments to Ask Bjørn Hansen at ask@perl.org | Group listing | About