http://qs1969.pair.com?node_id=11121795


in reply to Re^4: What esteemed monks think about changes necessary/desirable in Perl 7 outside of OO staff
in thread What esteemed monks think about changes necessary/desirable in Perl 7 outside of OO staff

FYI instead of $line =~ s/\s+$//; # rtrim() in Perl you can use AWK hack is split:

($line)=split(' ',$line,1)

Perhaps I am misunderstanding something but are you saying that $line =~ s/\s+$//; and ($line)=split(' ',$line,1); are equivalent? That doesn't seem to be the case, the latter appearing to implement the ltrim() you desire. This code

use strict; use warnings; my $line = q{ aaa bbb ccc ddd eee fff }; ( $line ) = split( ' ', $line, 1 ); print qq{-->$line<--\n};

produces

-->aaa bbb ccc ddd eee fff <--

Perhaps you could clarify?

Cheers,

JohnGG

  • Comment on Re^5: What esteemed monks think about changes necessary/desirable in Perl 7 outside of OO staff
  • Select or Download Code

Replies are listed 'Best First'.
Re^6: What esteemed monks think about changes necessary/desirable in Perl 7 outside of OO staff
by likbez (Sexton) on Sep 15, 2020 at 15:12 UTC
    It removes only leading whitespace. There is no alternative to regex idiom for trailing whitespace that I know of.

      No elegant alternative. As I showed in the benchmark, this works fine:

      sub splt{split" ",reverse((split" ",(reverse$x),1)[0]),1;};

      To be honest, i all the years that I "do" Perl (since perl-4.016), I have never seen anyone using split to trim leading (or trailing) whitespace.


      Enjoy, Have FUN! H.Merijn

        Had a reeeeeaaaaly vague recollection and the Perl Cookbook (Ch 1 section 19) does actually offer $_ = join(' ', split(' ')); as an alternative to these three substitutions:

        s/^\s+//; s/\s+$//; s/\s+/ /g;

        to strip and canonicalize to single spaces; and does offer this trim sub:

        sub trim { my @out = @_ ? @_ : $_; $_ = join(' ', split(' ')) for @out; return wantarray ? @out : "@out"; }

        Edit: That being said, I don't recall having seen this construct in the wild otherwise and had the vaguest of hunches that PC mentioned anything like this so I'd hardly call it a "common idiom" either.

        The cake is a lie.
        The cake is a lie.
        The cake is a lie.

        No elegant alternative. As I showed in the benchmark, this works fine:

        sub splt{split" ",reverse((split" ",(reverse$x),1)[0]),1;};
        The most elegant approach to this problem is the use of tr function. The implementation below beats regex three times and can be made faster by trivial extension of tr function mentioned in my prev post (something like option 'x' -- stop the translation on the first symbol outside the set1 and return this position), which can be used instead of more general function index for searching single characters in the string and can made like rindex to be able to search in reverse direction too.

        Looks like the solution for trim from the Cookbook mentioned by Fletch along with potentially deforming the string is slower then regex in my test(on my machine it took 3.56 sec real time).

        Here is the "tr based" algorithm for trim:

        time perl -e 'for (1..1000000) { $line=" aaa bbb ccc ddd eee fff "; $_=$line; $_=~tr/ /x/c; $start=index($_,'x'); $line=substr($line,$start,rindex($_,'x')-$start+1); }'
        
        real 0m1.112s
        user 0m1.076s
        sys 0m0.031s
        
        Can be made into a single statement making it slightly( ~7%) slower:
        $line=substr($line,($start=index($_=$line=~tr/ /x/cr,'x')),rindex($_,'x')-$start+1);
        
        # time perl -e 'for (1..1000000) { $line=" aaa bbb ccc ddd eee fff "; $line=substr($line,($start=index($_=$line=~tr/ /x/cr,'x')),rindex($_,'x')-$start+1); }' 
        real 0m1.189s
        user 0m1.154s
        sys 0m0.015s