in reply to Pushing hash ref onto array ref

The "subtle difference" is that push-ing to an array reference was an experimental feature (added circa-5.10 IIRC | added with Perl 5.14, removed as of Perl 5.24) that is now removed. For this reason, I would avoid it even if your particular version of Perl still supports it. (Update: If you intend ever to publish your module, I would absolutely avoid it!)

Win8 Strawberry 5.30.3.1 (64) Sun 04/11/2021 19:15:44 C:\@Work\Perl\monks >perl use strict; use warnings; use Data::Dump qw(dd); my %attrs = qw(foo 1 bar 2);; my @products = ({ 'id' => 0, 'name' => 'Test', 'description' => 'Some test data', 'qty' => 1, 'price' => 1000, }); $attrs{'trolley'} = \@products; my $self = \%attrs; my $new_product = { qw(id 1 name Widget) }; push $self->{'trolley'}, $new_product; # push @{ $self->{'trolley'} }, $new_product; dd \%attrs; ^Z Experimental push on scalar is now forbidden at - line 22, near "$new_ +product;" Execution of - aborted due to compilation errors.


Give a man a fish:  <%-{-{-{-<

Replies are listed 'Best First'.
Re^2: Pushing hash ref onto array ref
by Fletch (Bishop) on Apr 12, 2021 at 05:08 UTC

    I'd use push @{ $hash->{'key'} }, $new out of habit personally, but if you've got a new enough perl (post 5.24.0 according to perlref; you can use back to 5.20 with a feature declaration) you could use the new postfix deref syntax push $hash->{'key'}->@*, $new instead.

    Edit: Clarified version requirement.

    The cake is a lie.
    The cake is a lie.
    The cake is a lie.

      I've been making a point of using "perlref: Postfix Dereference Syntax". It removes the need for nested braces and brackets (e.g. %{$aref->[$i]} and @{$href->{$key}}) which can be confusing. It also reads linearly; i.e. ref->deref_to (e.g. $ref->%*) vs. deref_to{ref}.

      For very simple dereferencing, I often find myself using the older (original) syntax (e.g. $$scalarref). This is no doubt out of years of habit and muscle memory. I still think $scalarref->$* is clearer and I try to remember to use that; it also adds consistency to my code.

      I also find "perlref: Postfix Reference Slicing" to be a lot clearer; especially when the initial reference is a complex variable itself.

      Of course, that all requires a sufficiently new version of Perl. For instance, I can't use that for $work where I'm constrained to 5.16; for personal code, where I'm using the latest Perl (currently 5.32) that's not an issue.

      — Ken

        Of course, that all requires a sufficiently new version of Perl. For instance, I can't use that for $work where I'm constrained to 5.16; for personal code, where I'm using the latest Perl (currently 5.32) that's not an issue.

        It didn't occur to me that they both worked because I am using an old version of Perl v5.16.3 on the server. Because I hadn't made the connection with versioning, I didn't think to try it locally on v5.32.1...

Re^2: Pushing hash ref onto array ref
by Bod (Parson) on Apr 12, 2021 at 11:54 UTC
    (Update: If you intend ever to publish your module, I would absolutely avoid it!)

    Yes...this module is probably of sufficient utility to be heading for CPAN so expect a few more questions about it and an RFC when I get that far...