http://qs321.pair.com?node_id=1120398


in reply to Re^2: Use of uninitialized value in pattern match (m//)
in thread Use of uninitialized value in pattern match (m//)

Having that cleared, now you can concentrate on your regex issue in line 25 ;-)

I thought about your code and there are some other topics:

Here's an untested rewrite based upon these ideas:

#!/usr/bin/perl # http://perlmonks.org/?node_id=1120387 use strict; use warnings; my $log_dir = '/home/user1'; my $log_file = "$log_dir/trans.log"; my $trans_dir = '/data/directoy1'; # Log handles if ( not open my $loghandle, ">>", $log_file ) { # lexical hand +le and three argument form of open() # syslog ... # what's this? die "Cannot open file $log_file: $!"; } # maybe instead of opendir ... and readdir ... my @files = grep { -f } glob( "$trans_dir/*OT*" ); foreach my $file (@files) { print STDERR "File: $file\n"; print "$file\n"; open my $fh, "<", $file # same here; l +exical file handle and 3-arg-form of open() or die "Cannot open $file: $!"; while ( my $line = <$fh> ) { if ( (my $participant) = $line =~ m{(.....)/} ) { # expl +icitely use $line for regex print "$participant"; # only + print when match was found } } close $fh; }

Replies are listed 'Best First'.
Re^4: Use of uninitialized value in pattern match (m//)
by chris01010 (Novice) on Mar 18, 2015 at 12:43 UTC

    Thanks Linuxer, you adaption worked a treat (inluding glob)

    Just so people know I have only been on a 3 day course and I am "self teaching" the rest. So I really do appreciate the assistance and suggestions

    That being said :0), I am now moving the script on so that it reads each line and tries to match 2 values, both of which can be either one value or another

    I.E the first value can be 7722 or 59001 (appearing before the first occurence of /) and the second value can be N or U or C (which is the 362 character on the line)

    Once it matches both it should print the line, if not skip past it.

    I've had a go, but once again getting an error

    #!/usr/bin/perl # http://perlmonks.org/?node_id=1120387 use strict; use warnings; my $log_dir = '/home/smithc'; my $log_file = "$log_dir/trans.log"; my $trans_dir = '/data/FSA_Retrieval'; # Log handles if ( not open my $loghandle, ">>", $log_file ) { # lexical hand +le and three argument form of open() # syslog ... # what's this? die "Cannot open file $log_file: $!"; } # maybe instead of opendir ... and readdir ... my @files = grep { -f } glob( "$trans_dir/*OT*" ); foreach my $file (@files) { print STDERR "File: $file\n"; print "$file\n"; open my $fh, "<", $file # same here; l +exical file handle and 3-arg-form of open() or die "Cannot open $file: $!"; while ( my $line = <$fh> ) { if (/(7722/|59001/)/ && /.{361}(N|U|C)/) { print; } } close $fh; }

    When I run a perl -c against the script I get the compile error

    Unmatched ( in regex; marked by <-- HERE in m/( <-- HERE 7722/ at test2.pl line 37

      /(7722/|59001/)/

      If the slash is used as the delimiter, you can't use it as literal, you have to backslash it. Or, switch to a different delimiter:

      /(7722\/|59001\/)/ # or better: m=(7722/|59001/)=
      لսႽ† ᥲᥒ⚪⟊Ⴙᘓᖇ Ꮅᘓᖇ⎱ Ⴙᥲ𝇋ƙᘓᖇ