in reply to Delete a line

Hello karthik92,

Welcome to the Monastery. Well it looks the fellow Monk 1nickt provided an answer to your question. Just to include a two more alternative solutions:

#!/usr/bin/perl use strict; use warnings; # use Benchmark qw(:all) ; # WindowsOS use Benchmark::Forking qw( timethese cmpthese ); # UnixOS my $str = " test of white space"; my $results = timethese(100000000, { 'regex' => sub { $str =~ /^\s/ }, 'substr' => sub { substr($str, 0, 1) eq ' ' }, 'ord' => sub { ord($str) == 32 }, }, 'none'); cmpthese( $results ); __END__ $ perl test.pl Rate regex substr ord regex 9225092/s -- -44% -87% substr 16556291/s 79% -- -77% ord 73529412/s 697% 344% --

I used Benchmark to compare the alternative solutions and the fastest and best option on this case seems to be ord.

Update: Sample of the proposed solution:

my @strs = ("1234 pass 25 30 1", " pass 25 30 2", "1965 pass 35 45 1", " pass 35 45 2"); foreach my $sample (@strs) { if (ord($sample) == 32) { say "Matched: " . $sample; } } __END__ $ perl test.pl Matched: pass 25 30 2 Matched: pass 35 45 2

Update2: In case you are wondering about ord it simply reads the first character and returns the numeric value. From the ASCII table 32 decimal is SPACE number 1 (character) would return 49.

Hope this helps, BR.

Seeking for Perl wisdom...on the process of learning...not there...yet!

Replies are listed 'Best First'.
Re^2: Delete a line
by Laurent_R (Canon) on Dec 22, 2017 at 19:53 UTC
    Thank you very much for this really interesting benchmark, thanos1983, I knew that substr was likely to be faster than a regex for that type of case, but I never thought about using ord for that and did not imagine it would be so significantly faster. I still have to figure out whether it makes a significant difference in my use cases (typically reading a very large file and discarding a sizable fraction of its lines), but I might make good use of that to enhance the performance of some of my programs.

      Hello Laurent_R,

      I love timing things and playing with details. To me it does not make any difference, any solution would choose work just fine since I am not handling huge files.

      I am glad that someone else can take advantage of this maybe in the future.

      BR / Thanos

      Seeking for Perl wisdom...on the process of learning...not there...yet!
Re^2: Delete a line
by Anonymous Monk on Dec 22, 2017 at 21:34 UTC

    If you pass $str as an argument to the benchmarked subs, the difference will be markedly less pronounced. Run the bench with time limit instead of loop count, and you'll see the test takes a suspiciously long time.

    The subs in question are too trivial to measure via Benchmark. Yet another example of benchmarking pitfalls...