Consider using a regex that captures sets of two digits (or 'empties') separated by a comma, as tuples:
use strict;
use warnings;
while ( my $line = <DATA> ) {
print +( join ',', map "($_)", $line =~ /(\d*,\d*),?/g ), "\n";
}
__DATA__
1,1,,,,
1,2,,,,
3,4,1,1,,
1,1,1,1,,
5,6,3,4,1,2
1,1,1,1,1,1
,,,,1,1
,,1,2,,
,,1,1,1,2
,,,,,
5,6,3,4,2,2
Output:
(1,1),(,),(,)
(1,2),(,),(,)
(3,4),(1,1),(,)
(1,1),(1,1),(,)
(5,6),(3,4),(1,2)
(1,1),(1,1),(1,1)
(,),(,),(1,1)
(,),(1,2),(,)
(,),(1,1),(1,2)
(,),(,),(,)
(5,6),(3,4),(2,2)
And then testing for '1,1' and '1,2' in each line:
use strict;
use warnings;
my ( $i, $success, $fail );
while ( my $line = <DATA> ) {
$i++;
my %tuples = map { $_ => 1 } $line =~ /(\d*,\d*),?/g;
$success++ if exists $tuples{'1,1'};
$fail++ if exists $tuples{'1,2'};
}
print "Total Lines: $i\nSuccess: $success\nFail: $fail\n";
__DATA__
1,1,,,,
1,2,,,,
3,4,1,1,,
1,1,1,1,,
5,6,3,4,1,2
1,1,1,1,1,1
,,,,1,1
,,1,2,,
,,1,1,1,2
,,,,,
5,6,3,4,2,2
Output:
Total Lines: 11
Success: 6
Fail: 4
BTW - You were off by one in all of your array indices. You had:
if((($f[1]==1)&&($f[2]==1))|| ...
when you meant:
if((($f[0]==1)&&($f[1]==1))|| ...
Hope this helps!
Edit: Updated to reflect the '1,2' "Fail" condition, which I failed to notice. Thank you, Jim.
-
Are you posting in the right place? Check out Where do I post X? to know for sure.
-
Posts may use any of the Perl Monks Approved HTML tags. Currently these include the following:
<code> <a> <b> <big>
<blockquote> <br /> <dd>
<dl> <dt> <em> <font>
<h1> <h2> <h3> <h4>
<h5> <h6> <hr /> <i>
<li> <nbsp> <ol> <p>
<small> <strike> <strong>
<sub> <sup> <table>
<td> <th> <tr> <tt>
<u> <ul>
-
Snippets of code should be wrapped in
<code> tags not
<pre> tags. In fact, <pre>
tags should generally be avoided. If they must
be used, extreme care should be
taken to ensure that their contents do not
have long lines (<70 chars), in order to prevent
horizontal scrolling (and possible janitor
intervention).
-
Want more info? How to link
or How to display code and escape characters
are good places to start.