I am currently reading a file and storing the data in an array named @lines
. Then, I loop through this array using a for
loop and inside the loop I match on certain values:
$find = "fever";
if ($_ =~ /$find/) {
print "$_\n";
$number++;
#@lines =
#print ("there are : " . $number);
}
At the moment, I am using a scalar, $find
, with a value of fever
instead of performing the repetitive statements for each filter.
Can I pass an array for comparison instead of a scalar keyword?
readline in LIST context. In this case, after opening the file we read from the $fh filehandle into an array variable: my @rows = <$fh>;. In this case Perl will read in the content of the whole file in one step. Each row in the file will be one of the elements of the array.
Just reading the file into an array, one line per element, is trivial: open my $handle, '<', $path_to_file; chomp(my @lines = <$handle>); close $handle; Now the lines of the file are in the array @lines .
If you read a file into a list it will take everything at once
@array = <$fh>; # Reads all lines into array
Contrast this with reading into a scalar context
$singleLine = <$fh>; # Reads just one line
Reading the whole file at once can be a problem, but you get the idea.
Then you can use grep
to filter your array.
@filteredArray = grep /fever/, @array;
Then you can get the count of filtered lines using scalar
, which forces scalar (that is, single value) context on the interpretation of the array, in this case returning a count.
print scalar @filteredArray;
Putting it all together...
C:\temp>cat test.pl
use strict; use warnings; # always
my @a=<DATA>; # Read all lines from __DATA__
my @f = grep /fever/, @a; # Get just the fevered lines
print "Filtered lines = ", scalar @f; # Print how many filtered lines we got
__DATA__
abc
fevered
frier
forever
111fever111
abc
C:\temp>test.pl
Filtered lines = 2
C:\temp>
If you have Perl 5.10 or later, you can use smart matching (~~
) :
my @patterns = (qr/foo/, qr/bar/);
if ($line ~~ @patterns) {
print "matched\n";
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With