Dr.Ruud wrote: > Rob Dixon schreef: >> Richard Lee wrote: >>> Dr.Ruud wrote: >>>> Richard Lee schreef: > >>>>> While reading perl cookbook, I came to page 94 and having a hard >>>>> time understanding this particular phrase >>>>> my $sepchar = grep( /,/ => @_ ) ? ";" : ","; >>>> Shortcutting alternative: >>>> my $sepchar = ","; >>>> for (@_) { /,/ and $sepchar = ";" and last } >>>> but (unless @_ is quite big) the grep alternative is likely to be >>>> faster. >>> I understood the original but I am not so sure of your solution?? >>> Can you write it out completely so that I can try it out? >> It's equivalent to: >> >> my $sepchar = ','; >> foreach (@_) { >> if (/,/) { >> $sepchar = ';'; >> last; >> } >> } >> >> And IMO is much better written that way. > > TIMTOWTDI.
But I'm sure you'll agree that some ways are more awkward or obfuscated than others. > Another shortcutting alternative: > > my $sepchar = ','; > for (@_) { $sepchar = ";" and last if /\Q$sepchar/ } This relies on ';' being true, and uses 'and' in void context. $sepchar = '' and last if ... wouldn't work; or, rather, it would work but wouldn't exit from the loop when intended. > And another: > > use List::Util qw(first); > my $sepchar = first( {/,/} @_ ) ? ";" : ","; This relies on an element matching /,/ being true, and first() unnecessarily returns the element value when all that is required is a boolean. > And another: > > use List::MoreUtils qw(any); > my $sepchar = any( {/,/} @_ ) ? ";" : ","; Spot on. I believe that's the ideal solution as everything is being used for its intended purpose. any() is required to return only a boolean value, and it can be implemented so that it stops searching as soon as the condition is satisfied, whereas grep is obliged to count right to the bitter end. It's a shame that MoreUtils isn't a standard module. > But, as already stated, often this is fine: > > my $sepchar = grep(/,/, @_) ? ";" : ","; It is the usual way, yes. It has the huge advantage that it does what it says it does (apart from grep being an awful name for a function). Rob -- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED] http://learn.perl.org/