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

--
To unsubscribe, e-mail: beginners-unsubscr...@perl.org
For additional commands, e-mail: beginners-h...@perl.org
http://learn.perl.org/


Reply via email to