On Mon, Oct 3, 2016 at 10:45 PM Lawrence Statton <lawre...@cluon.com> wrote:
snip

> the =()= "operator" just does that without creating a temporary variable

snip

Almost, but not quite.  You can see the difference when =()= is in list
context:

my @a = (my @temp) = get_clown_hat;
my @b = () = get_clown_hat;

@a will have the items returned by get_clown_hat and @b won't.  The
assignment operators have a return value.  For scalar assignment, it is
just the scalar being assigned, regardless of the context.  For list
assignment in list context it is the list that was assigned:

$ perl -E '@a = ($a, $b) = 1 .. 100; say "a is ", join ", ", @a;'
a is 1, 2
$ perl -E '@a = () = 1 .. 100; say "a is ", join ", ", @a;'
a is

and the number of items on the right hand side of the assignment when it is
in scalar context:

$ perl -E '$a = () = 1 .. 100; say "a is $a"'
a is 100
$ perl -E '$a = ($b) = 1 .. 100; say "a is $a"'
a is 100

You can see how different approaches compare using the Benchmark module:

#!/usr/bin/perl

use strict;
use Benchmark;
use warnings;

my $max_hats = 100;

sub get_clown_hat {
return (0 .. $max_hats);
}

# here, scalar context is causing the .. operator
# to be the flip flop operator instead of the
# range operator, so we get 1E0 instead of
# 100 (the last item) or 101 (the count)
# when not compared to anything, the range operator
# compares against $. (the line number of the last
# line read from the currently selected file handle)
my $flip_flop_result = get_clown_hat;

print "wrong result: $flip_flop_result\n";

my %subs = (
array => sub {
my @a = get_clown_hat;
return scalar @a;
},
empty => sub {
my $count = () = get_clown_hat;
return $count;
},
);

for my $sub (keys %subs) {
    print "$sub: ", $subs{$sub}(), "\n";
}

for my $n (1_000, 10_000, 100_000) {
$max_hats = $n;

print "\n$n items\n\n";
Benchmark::cmpthese -2, \%subs;
}

Avoiding copying the data is about twice as fast for counting items:

Use of uninitialized value $. in range (or flip) at bench.pl line 11.
wrong result: 1E0
array: 101
empty: 101

1000 items

         Rate array empty
array 12620/s    --  -52%
empty 26457/s  110%    --

10000 items

        Rate array empty
array 1310/s    --  -50%
empty 2634/s  101%    --

100000 items

       Rate array empty
array 124/s    --  -49%
empty 245/s   97%    --

Reply via email to