Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much

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.

Replies are listed 'Best First'.
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";
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?

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

How do I use this? | Other CB clients
Other Users?
Others perusing the Monastery: (9)
As of 2018-03-21 20:56 GMT
Find Nodes?
    Voting Booth?
    When I think of a mole I think of:

    Results (270 votes). Check out past polls.