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

Re: split question

by chipmunk (Parson)
on Sep 08, 2001 at 18:36 UTC ( #111161=note: print w/ replies, xml ) Need Help??


in reply to split question

I agree with the earlier responses that a regex is a better solution that split here. However, I noticed that all the suggested regex solutions access $1 et al. without making sure the regex match succeeded. A failed match does not reset the special regex variables -- they keep their values from the previous successful match!

Here's one way to check the success of the match. Of course, you can change the structure, but the basic idea is to only access $1 et al. if the match succeeds.

my $inLine = "RPC, rpc #001b, (1987)"; my $year; if ($inLine =~ /\((\d+)\)/) { $year = $1; } else { die "No year found in '$inLine'.\n"; } print "Found year '$year' in '$inLine'.\n";

 

Here's a demonstration of a bug caused by not checking the success of the match.
my $inLine = "RPC, rpc #001b, 1987"; $inLine =~ /(#\d+[a-z])/; my $rpcNum = $1; print "Found rpc num '$rpcNum' in '$inLine'.\n"; $inLine =~ /\((\d+)\)/; my $year = $1; print "Found year '$year' in '$inLine'.\n";
This produces the following output.
Found rpc num #001b in RPC, rpc #001b, 1987. Found year #001b in RPC, rpc #001b, 1987.


Comment on Re: split question
Select or Download Code
Re: Re: split question
by Anonymous Monk on Sep 09, 2001 at 03:12 UTC
    Using the dialectic is another way to deal with this.

    #!/usr/bin/perl # Prints 'First: A', as you expect 'abcd' =~ /(a)/; print "First: ", uc $1, "\n"; # Also prints 'Second: A', though you expect it not to 'efgh' =~ /(a)/; print "Second: ", uc $1, "\n"; #==== # Prints 'Third: A' - again, as you expect 'abcd' =~ /(a)/ and print "Third: ", uc $1, "\n"; # Doesn't print anything - what you want 'efgh' =~ /(a)/ and print "Fourth: ", uc $1, "\n";
    -blyman
Re: Re: split question
by dragonchild (Archbishop) on Sep 10, 2001 at 16:30 UTC
    A slightly more readable version might be:
    my $inLine = "RPC, rpc #001b, (1987)"; my ($year) = $inLine =~ /\((\d+)\)/; die "No year found in '$inLine'\n" unless defined $year;
    The reason for checking definedness is because of the potential for an erroneous year zero. (You might want to die on year 0 ... I dunno.)

    ------
    We are the carpenters and bricklayers of the Information Age.

    Don't go borrowing trouble. For programmers, this means Worry only about what you need to implement.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://111161]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chanting in the Monastery: (12)
As of 2014-10-22 13:17 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    For retirement, I am banking on:










    Results (118 votes), past polls