in reply to Re^2: How do I use grep in a script
in thread How do I use grep in a script

thank you - using your example, I have the following
#! / usr/bin/perl -w use strict; use warnings; use POSIX 'strftime'; my $nm = strftime('%Y', localtime).".txt"; my $filename = 'Facs_Data.txt'; open my $fh, '<', $filename or die "Couldn't open '$filename': $!"; my @lines = map { /:([^\s]+)/ ? $1 : () } # take the stuff between th +e : and the first blank grep { /Acct:/ } <$fh>; # Read a file line by line and sel +ect the lines matching Acct: my $outfile = $_."_"."$nm" for @lines ; print $outfile; #open (OUTFILE, ">$outfile"); # do whatever with the values in @lines #print "$_\n" for @lines; close($filename);

root@localhost:~/GoldenLFiles# perl facs.pl Use of uninitialized value $outfile in print at facs.pl line 17, <$fh> line 168801.

If I comment the print $outfile to see the output I get the error above. What am I missing here? Thanks in advance

Replies are listed 'Best First'.
Re^4: How do I use grep in a script
by Corion (Patriarch) on Dec 26, 2017 at 20:27 UTC
    my $outfile = $_."_"."$nm" for @lines ;

    This line will set/declare $outfile in a loop, which is unlikely to be what you want.

    Did you want a loop over @lines instead? Or did you want to take the first element of @lines?

    print sprintf "Have %d items\n", 0+@lines; my $item = $lines[0]; my $outfile = $item . '_' . $nm; print "$outfile\n";

    I tried the following code with the input data in the __DATA__ section for convenience:

    #! / usr/bin/perl -w use strict; use warnings; use POSIX 'strftime'; my $nm = strftime('%Y', localtime).".txt"; my @lines = map { /:([^\s]+)/ ? $1 : () } # take the stuff between th +e : and the first blank grep { /Acct:/ } <DATA>; # Read a file line by line and select the lines ma +tching Acct: print sprintf "Have %d items\n", 0+@lines; my $item = $lines[0]; my $outfile = $item . '_' . $nm; print "$outfile\n"; print $outfile; #open (OUTFILE, ">$outfile"); # do whatever with the values in @lines #print "$_\n" for @lines; __DATA__ foo Acct:123 Acct:456 bar

    Note that you have a close($filename), which likely should be close($fh) in your code.

      Thanks You Corion, Yes, I think I want to loop over @lines. The $outfile I am trying to create here is a separate file for each Account designated by Acct:1234 (the 1234 actually).

      To explain a bit there are SEVERAL lines of text following this line (including this line) that need to be written to that file name.

      I wish this to happen for each section where the Acct:#### occurs, but first I wanted to learn how to create the file in the form of 1234_2017.txt.

      Does this make sense ?

        Assuming your data is like this (numeric account ids)

        Acct:1234
        1
        2
        3
        Acct:2345
        2
        3
        4
        

        then you could use a hash of arrays (HOA) (see perldsc) to split the file into parts.

        #!/usr/bin/perl use strict; my $acct; my %data = (); my $infile = 'Facs_Data.txt'; open my $fh,'<',$infile or die "Could not open '$infile' : $!"; while (<$fh>){ next unless /\S/; # skip blank lines if (/Acct:(\d+)/){ $acct = $1; } push @{$data{$acct}},$_ if ($acct); } close $fh; for my $acct (keys %data){ my $outfile = $acct.'_2017.txt'; print "Creating $outfile\n"; open my $fh,'>',$outfile or die "Could not open '$outfile' : $!"; for (@{$data{$acct}}){ print $fh $_; } close $fh; }
        poj