Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re^6: Addional "year" matching functionality in word matching script

by bms9nmh (Novice)
on Jun 28, 2016 at 14:06 UTC ( [id://1166776] : note . print w/replies, xml ) Need Help??


in reply to Re^5: Addional "year" matching functionality in word matching script
in thread Addional "year" matching functionality in word matching script

I can see this print each line in the title and the  => bit shows the year being extracted (not sure that's the right word) from the title.
sub find_year { my( $str ) = @_; my $year; $year = $1 if( $str =~ /\b((?:19|20)\d\d)\b/ ); return $year } for my $title ( "Let's party like it's 1999", "If 6 was 9", "If 6 was 9", "Summer of 69", "Disco 2000", ) { print $title , " => ", find_year($title), "\n"; }
One thing I'm not sure of is, I've tried to integrate the info above so that I can use the $title from a csv file rather than titles typed into the script (as in the above example). I have attempted this below but it's not working. I'd appreciate if someone could tell me what exactly i'm doing wrong. I know I'm being prompted to learn which I'm happy to do, but I think I would learn faster if someone told me what I have done wrong in the piece of code below.
sub find_year { my( $str ) = @_; my $year; $year = $1 if( $str =~ /\b((?:19|20)\d\d)\b/ ); return $year } #get the title from csv3 open CSV3, "<csv3" or die; while (<CSV3>) { chomp; my ($title) = $_ =~ /^.+?,\s*([^,]+?),/; #/ match the title } for my $title { print $title , " => ", find_year($title), "\n"; }

Replies are listed 'Best First'.
Re^7: Addional "year" matching functionality in word matching script
by Corion (Patriarch) on Jun 28, 2016 at 14:17 UTC

    This second loop creates its own $title variable:

    for my $title { print $title , " => ", find_year($title), "\n"; }

    What you want instead is to integrate that call to find_year into your while loop:

    while( <...>) { ... my ($title) = ...; print "Have title '$title'\n"; print $title , " => ", find_year($title), "\n"; };
      Ok, thanks that's working nicely now that I'm printing it within the while loop. Is there any way to maintain the variable outside the while loop?

        Sure there is, but you will need to think about what value the variable should have after the while loop ends:

        my $year; while( my $title = <CSV3> ) { $year = find_year( $title ); }; print "I now have a year of '$year'\n";

        Do you really want to keep only one year from all the titles stored in your CSV file?