A Lukaszewski wrote:
> 
> Greetings all,

Hello,

> I have a comma-delimited lexical file with four fields: line number, the
> first part of a word, the second part of a word, and the word combined.
>   The first and fourth fields are only for reference.  The program I am
> developing is very simple.  If field two and field three both have
> accents in them, then print the line to an output file.
> 
> The heavily-commented program is below.  Thus far, all I get is an exact
> replica of the input file.  In addition to a plain binding operator of
> '=~ //', I have also tried explicit matching (m//) and regex (qr//).
> 
> #!/usr/bin/perl
> 
> #############################################################
> #############################################################
> # A PROGRAM TO READ THE SUB-WORD HEADERS OF A               #
> #              COMMA-DELIMITED FILE                         #
> # AND DETERMINE WHICH LINES HAVE MULTIPLE ACCENTS           #
> #############################################################
> #############################################################
> 
> use strict;

If you had had warnings enabled as well as strict you might have found
your problem a lot sooner.  :-)

use warnings;


> ###################################
> # OPEN THE INPUT AND OUTPUT FILES #
> ###################################
> 
> my ($file, $outfile);
> 
> $file    = 'y.csv' ;
> # Name the input file
> $outfile = 'y.res';
> # Name the output file

In Perl you usually declare your variables where you first use them and
your comments provide no useful additional information.

my $file    = 'y.csv';
my $outfile = 'y.res';


> open(INFO, "$file"  ) or die "Cannot open $file:$!\n";
> # Open the input file or report failure
> open(OUT, ">>$outfile") or die "Cannot open file y.res!\n";
> # Open the output file
> 
> ########################################
> # INITIALIZATION OF SCALARS AND ARRAYS #
> ########################################
> 
> my $line;             # = scalar by which program steps through data
> my $fieldEval1;       # = holding scalar for evaluating whether the
>                        # first half of the word has an accent in it
> my $fieldEval2;       # = holding scalar for evaluating whether the
>                        # second half of the word has an accent in it
> my @field;            # = holding array for the split line

You should declare these variables where you use them to limit their
scope.


> #######################################################
> # FOREACH CONTROL TO READ THE INPUT FILE LINE BY LINE #
> #   AND MANIPULATE THE DESIRED DATA TO AN OUTPUT FILE #
> #######################################################
> 
> foreach $line (<INFO>) {

foreach my $line ( <INFO> ) {

But you should really be using a while loop to read from files.  foreach
and for create a list in memory which means that the whole file will
have to be read before processing starts.

while ( my $line = <INFO> ) {


> # Assign the contents of the input file to $line one line at time for
> # evaluation.
>         chomp ($line);               # remove input field separator
>         next unless $line;           # skip blank lines
>         @field = split /,/, $line;   # Read each line as four fields split by
> commas
> 
> # Assign the second field to an evaluation scalar
>         $fieldEval1 = $field[1];
> # Assign the third field to an evaluation scalar
>         $fieldEval2 = $field[2];

You can assign to $fieldEval1 and $fieldEval2 directly from the split:

my ( undef, $fieldEval1, $fieldEval2 ) = split /,/, $line;

But it doesn't look like you are using those variables later?


> # Test whether BOTH the second or third fields have accents in them
> # Accents are represented by the following characters: k K c ; ' [ { ] }
> # \ and |.
>         if ({$field[1] =~ /[kKc;'\[\{\]\}\\\|]/} && {$field[2] =~
> /[kKc;\'\[\{\]\}\\\|]/}) {

Your problem is in this line (which warnings would have complained
about.)  The braces {} around the pattern matches are creating an
anonymous hash which returns a reference to that hash which is always
true in a boolean context which means that the expression is always
true.

if ( $fieldEval1 =~ /[][{};'\\|kKc]/ && $fieldEval2 =~ /][{};'\\|kKc/ )
{


Or you could probably simplify it like this:

my ( $fieldEval ) = $line =~ /^[^,]+,([^,]+,[^,]+)/;

if ( $fieldEval =~ /[][{};'\\|kKc]/ ) {


>             print OUT "$line\n";  # If so, print the line to file
>         }
> }
> 
> close (OUT);          # Close the output file
> close(INFO) ;         # Close the input file
> __END__



John
-- 
use Perl;
program
fulfillment

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
<http://learn.perl.org/> <http://learn.perl.org/first-response>


Reply via email to