On Aug 23, 2013, at 9:06 AM, jet speed wrote: > Chaps, > > Please i need help on the regular expression, i have the sample code below. > I only want to match the entries from the array to the file and print the > matching line > > for example if i only want to match fc3/23, in my code it prints both the > lines fc3/2 and fc3/23. How to restrict to exact matches and print only ex: > fc3/23 > > > > out.txt > ------ > > fc3/2 10:00:00:00 host1 > fc3/23 10:00:00:00 host2 > fc10/1 10:00:00:00 host3 > fc10/11 10:00:00:00 host4 > fc3/1 10:00:00:00 host5 > fc3/14 10:00:00:00 host6 > fc12/1 10:00:00:00 host7 > fc12/12 10:00:00:00 host8 > > > sample code > -----------------
The code below does not compile. Please make sure you post valid programs if you want help. > > my @check = (fc3/23, fc10/1, fc3/14, fc12/12); You need to put quotes around strings: my @check = ('fc3/23', 'fc10/1', 'fc3/14', 'fc12/12'); > my $f2 = 'out.txt'; > for my $element(@check) { You should indent blocks (for, while) for readability. > open my $fh2, '<', $f2 or die "could not open $f2: $!"; Here, you are opening the file for each iteration. Reading files is much slower than iterating over an array. Therefore, if you have to 1) read a file and 2) iterate over an array, you should reverse the order of operations: Read a line from the file and then iterate over the array for each line in the file. > while (my $line = <$fh2>) { > chomp $line; > if ($line = / ^(fc\d+\/\d+/) { This line has three syntax errors: 1. You want the binding operator =~ instead of assignment = 2. You don't want a space between / and ^ 3. The final / and closing ) should be swapped. I am assuming you mean: if ($line =~ /^(fc\d+\/\d+)/ { > $match=$&; Since your regular expression captures the entire match, you should use the capturing variable $1 instead of the whatever-matched variable $&. It is actually faster. Every line of your input will match the above regular expression, so the only effect is to extract the first field. You can do that by splitting the line on whitespace: my( $first, @rest ) = split(/ /,$line); > } > if ($element =~ $match) { You need slashes or the m operator to define a regular expression: if( $element =~ /$match/ ) { If you want to match the entire string, you need to add beginning and ending anchors: if( $element =~ /^$match$/ ) { But if that is what you want, just use eq: if( $element eq $match ) { > print "$line \n"; > } > } > } > > > required output > -------------------- > > fc3/23 10:00:0:00 host2 > fc10/1 10:00:0:00 host3 > fc3/14 10:00:00:00 host6 > fc12/12 10:00:00:00 host8 > > Thanks > Sj > -- To unsubscribe, e-mail: beginners-unsubscr...@perl.org For additional commands, e-mail: beginners-h...@perl.org http://learn.perl.org/