[pm-h] Interesting Blog Posts on Context & Array vs List

G. Wade Johnson gwadej at anomaly.org
Wed Feb 19 14:18:43 PST 2014


On Wed, 19 Feb 2014 12:35:53 -0800 (PST)
Mark Allen <mrallen1 at yahoo.com> wrote:

> When subroutine signatures are released in 5.20, you'll be able to do
> 
> sub foo ($self, $foo, $bar, $baz) {
>    $foo ||= 'default';
>    $baz //= 0;
> 
>    ...;
> }

And, surely, someone will have a Perl script that will convert the old
form into the new one.<grin/>


> Yay!
> 
> 
> 
> On Wednesday, February 19, 2014 2:22 PM, G. Wade Johnson
> <gwadej at anomaly.org> wrote: 
> On Wed, 19 Feb 2014 12:02:25 -0800 (PST)
> "Michael R. Davis" <mrdvt92 at yahoo.com> wrote:
> 
> > > Personally I find context one of the most fascinating aspects of
> > > Perl (Maybe someone should do a presentation!) and I must admit
> > > I've been guilty of referring to things as being in "Array
> > > Context".  Does anyone disagree with these postings or have any
> > > additional knowledge to share?
> > 
> > The only case that should not be used is caught by use warnings.
> > Maybe I just think in "Perl context" nowadays...
> > 
> > perl -Mwarnings -e ' $a =      (5,6,7); print "$a\n"' #scalar
> > assignment of list  => 7 #never use this "feature"... perl
> > -Mwarnings -e '($a)=      (5,6,7); print "$a\n"' #array  assignment
> > of list  => 5 perl -Mwarnings -e ' $a = @a = (5,6,7); print "$a\n"'
> > #scalar assignment of array => 3 perl -Mwarnings -e '($a)= @a =
> > (5,6,7); print "$a\n"' #array  assignment of array => 5 perl
> > -Mwarnings -e ' $a =    @{[5,6,7]};print "$a\n"' #scalar assignment
> > of defref anon array => 3 perl -Mwarnings -e '($a)=
> > @{[5,6,7]};print "$a\n"' #array  assignment of defref anon array =>
> > 5
> 
> Great example.
> 
> To be a bit pedantic, the first is not a "scalar assignment of a list"
> it is "comma operator in scalar context". Putting parens around
> something only makes it a "list" on the left side of an assignment.
> And, that is an odd special case.
> 
> For those who can't imagine why you would do such a thing, it often
> happens when a sub returns a "list" (which it is in list context) and
> the calling code assigns it to a scalar. This completely changes how
> the return is interpreted.
> 
> > I actually don't like the current popular practice of doing
> > 
> > my ($self, $a, $b, $c)=@_;
> > 
> > I much prefer 
> > 
> > my $self = shift;
> > my $a    = shift;
> > my $b    = shift;
> > 
> > as I can
> > 
> > my $self = shift;
> > my $a    = shift || "default";
> > my $b    = shift // 0;
> > 
> > and actually understand what I did months later.
> 
> Although it only matters in a few circumstances, a single 'my'
> statement is marginally faster than multiples. I used to do the
> separate statement thing, but now I tend to:
> 
> my ($self, $foo, $bar, $baz) = @_;
> $foo ||= "default";
> $baz //= 0;
> 
> I vaguely remember something about a cost for the shift, but that may
> have been fixed.
> 
> The context concept is definitely critical to getting the most out of
> Perl.
> 
> G. Wade


-- 
It is wise to remember that you are one of those who can be fooled some
of the time.                                      -- Laurence J. Peter


More information about the Houston mailing list