On Aug 9, 2:59 pm, Larry <larry.grant...@gmail.com> wrote:
> While we are on the subject of inelegancies ... what if I want to
> assign the elements of @zam to scalars, but I don't care about
> $zam[2]? I'd like to do:
>
> my ($foo, $bar, undef, $baz) = @zam;
>
> but that won't compile,
Says who?
$ perl -le'
my @zam = qw/alpha beta gamma delta/;
my ($foo, $bar, undef, $baz) = @zam;
print for $foo, $bar, $baz;
'
alpha
beta
delta
> Any better way?
Array slices.
$ perl -le'
my @zam = qw/alpha beta gamma delta/;
my ($foo, $bar, $baz) = @zam[0,1,3];
print for $foo, $bar, $baz;
'
alpha
beta
delta
> And furthermore....
>
> What if $foo and $baz are already my'ed... I'd like to do:
>
> ($foo, my $bar, $baz) = @wham;
>
> but Perl doesn't like that either
Exactly what version of Perl are you running? This, again, works just
fine for me.
$ perl -le'
my @zam = qw/alpha beta gamma delta/;
my ($foo, $baz);
($foo, my $bar, $baz) = @zam[0,1,3];
print for $foo, $bar, $baz;
'
alpha
beta
delta
And indeed, B:

eparse even shows us that it's doing exactly what we
mean (that the second 'my' applies only to $bar, not $baz:
$ perl -MO=Deparse,-p -le'
my @zam = qw/alpha beta gamma delta/;
my ($foo, $baz);
($foo, my $bar, $baz) = @zam[0,1,3];
print for $foo, $bar, $baz;
'
BEGIN { $/ = "\n"; $\ = "\n"; }
(my(@zam) = ('alpha', 'beta', 'gamma', 'delta'));
my($foo, $baz);
(($foo, my($bar), $baz) = @zam[0, 1, 3]);
;
foreach $_ (($foo, $bar, $baz)) {
print($_);
}
-e syntax OK
Paul Lalli