Beefy Boxes and Bandwidth Generously Provided by pair Networks
Don't ask to ask, just ask
 
PerlMonks  

(ar0n: split methinks) Re: novice

by ar0n (Priest)
on Sep 27, 2000 at 13:35 UTC ( [id://34166]=note: print w/replies, xml ) Need Help??


in reply to novice

Since you want it *fast*, I'd suggest using split:
$_ = " one two three four five six"; @ary = split; print $ary[3];

update:
split splits $_ on whitespace by default.

To split $str on whitespace do:
$str = " one two three four five six"; $str =~ s/^\s+//; # remove leading spaces @ary = split /\s+/, $str; print $ary[3];

[~]

Replies are listed 'Best First'.
RE: Re: novice
by mrt (Acolyte) on Sep 27, 2000 at 14:19 UTC
    Thanks! but I have read that pattern matching is much more faster than split..Also =~ is supposed to be a little slower comparison operator. at present I am using temporarily for ex.
    ($a,$b,$c,$d)=split; # I get the value of fourth field in $d and do not use$a,$b,$c
    How is it in comparison to the way suggested by you?Please comment.. Thanks:-MRT
      update:
      I seem to be getting different times on each run (and different winners too), but over the whole split does appear to be the winner. I've changed the regex to a more condensed version.

      #!/usr/bin/perl -w use Benchmark 'timethese'; use strict; print "split: ", use_split(), "\n"; print "regex: ", use_regex(), "\n"; sub use_split { $_ = " one two three four five six"; split; # See Jouke's post (this may be faster). This is dep +recated though. return $_[3]; } sub use_regex { $_ = " one two three four five six"; s/^\s+//; m/^(?:[^\s]+\s+){3}([^\s]+)/; return $1; } timethese(-10, { regex => \&use_regex, split => \&use_split }); timethese(-50, { regex => \&use_regex, split => \&use_split }); timethese(-100, { regex => \&use_regex, split => \&use_split });

      The results (updated to 10, 50 and 100) (...drumroll please...):
      Benchmark: running regex, split, each for at least 10 CPU seconds... regex: 12 wallclock secs (10.64 usr + 0.00 sys = 10.64 CPU) @ 40 +522.18/s (n=431156) split: 10 wallclock secs (10.02 usr + 0.00 sys = 10.02 CPU) @ 37 +290.82/s (n=373654)
      and:
      Benchmark: running regex, split, each for at least 50 CPU seconds... regex: 68 wallclock secs (54.11 usr + 0.13 sys = 54.24 CPU) @ 40 +957.93/s (n=2221558) split: 56 wallclock secs (49.95 usr + 0.05 sys = 50.00 CPU) @ 38 +128.48/s (n=1906424)
      and
      Benchmark: running regex, split, each for at least 100 CPU seconds... regex: 136 wallclock secs (110.38 usr + 0.32 sys = 110.70 CPU) @ + 40548.93/s (n=4488766) split: 112 wallclock secs (100.00 usr + 0.02 sys = 100.02 CPU) @ + 38995.86/s (n=3900366)

      [~]

Re: (Jouke) novice
by Jouke (Curate) on Sep 27, 2000 at 14:42 UTC
    Or, if you wish to exclude the @ary
    #!/usr/bin/perl use strict; $_="one two three four"; split; print $_[2];

    Jouke Visser, Perl 'Adept'
      Be careful ... if you'd used warnings you'd see:

      Use of implicit split to @_ is deprecated at <blah blah>.

      If you really want the third field only, why not use print +(split)[2]?

      -dlc

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others browsing the Monastery: (7)
As of 2024-04-23 20:52 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found