[Purdue-pm] Efficiency, was: my 2015-08-12 challenge problem solution

Mark Senn mark at ecn.purdue.edu
Sun Aug 9 17:54:27 PDT 2015


Rick Westerman <westerman at purdue.edu> suggested:
|  my $data = 'aaa:b:cccc' ;
|  
|  my ($one) = reverse grep { $_ } split ':', $data ;
|  
|  my @twoarr = split ':', $data ;
|  my $two = $twoarr[-1] ;
|  
|  my $pos   = rindex $data , ':' ;
|  my $three = substr($data, $pos + 1) ;


EXECUTIVE SUMMARY

Use the code for $three.
The split function is subtle and it's easy to make a mistake.
As far as optimization goes, "first get it working, then make it
faster---if needed".


DETAILS

I am assuming that you want all characters after the second ":" in $data.
Call this the third field.

The code for $one doesn't work if the third field is "" or "0".

The code for $two doesn't work if the third field is "" unless
a split with -1 is done.

I added the code for $four, which is simpler than $one,
and works if the third field is "" or "0", if a split with -1 is done.

I added the code for $five which I find more understandable than $two---it
must do a split with -1.


RUN THIS CODE AND STUDY THE OUTPUT

for my $data ('aaa:b:', 'aaa:b:0', 'aaa:b:cccc')
{
    print "data          ($data)\n";

    my ($one) = reverse grep { $_ } split ':', $data ;
    my @twoarr = split ':', $data ;
    my $two = $twoarr[-1] ;
    my $pos   = rindex $data , ':' ;
    my $three = substr($data, $pos + 1) ;
    my ($four) = reverse split ':', $data ;
    my $five = (split ':', $data)[-1];
    print "split         ($one)  ($two)  ($three)  ($four)  ($five)\n";

    ($one) = reverse grep { $_ } split ':', $data, -1 ;
    @twoarr = split ':', $data, -1 ;
    $two = $twoarr[-1] ;
    $pos   = rindex $data , ':' ;
    $three = substr($data, $pos + 1) ;
    ($four) = reverse split ':', $data, -1 ;
    $five = (split ':', $data, -1)[-1];
    print "split with -1 ($one)  ($two)  ($three)  ($four)  ($five)\n";

    print "----------------------------------------\n";
}

# -mark


More information about the Purdue-pm mailing list