Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

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

by ikegami (Pope)
on Dec 26, 2017 at 17:35 UTC ( #1206217=note: print w/replies, xml ) Need Help??


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

map { /:([^\s]+)/ ? $1 : () } grep { /Acct:/ }
is a long way to write
map { /Acct:([^\s]+)/ }

Replies are listed 'Best First'.
Re^3: How do I use grep in a script
by Flintlock (Novice) on Dec 26, 2017 at 20:20 UTC
    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
      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 ?

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1206217]
help
Chatterbox?
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (2)
As of 2018-07-18 22:04 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    It has been suggested to rename Perl 6 in order to boost its marketing potential. Which name would you prefer?















    Results (397 votes). Check out past polls.

    Notices?