Search code examples
perlsyntaxoperatorsbracketscurly-brackets

consecutive operators and brackets


I'm just trying to learn a bit of Perl and have come across this:

foreach $element (@{$records})
{
    do something;
}

To my newbie eyes, this reads: "for each element in an array named @{$records}, do something" but, since that seems an unlikely name for an array (with "@{$" altogether), I imagine it isn't that simple?

I've also come across "%$" used together. I know % signifies a hash and $ signifies a scalar but don't know what they mean together.

Can anyone shed any light on these?


Solution

  • In Perl you can have a reference (a pointer) to a data structure:

    # an array
    my @array;
    
    # a reference to an array
    my $ref = \@array;
    

    When you have a reference to be able to use the array you need to dereference it

    @{ $ref }
    

    If you need to access an element as in

    $array[0]
    

    you can do the same with a reference

    ${$ref}[0]
    

    The curly brackets {} are optional and you can also use

    $$ref[0]
    @$ref
    

    but I personally find them less readable.

    The same applies to every other type (as %$ for a hash reference).

    See man perlref for the details and man perlreftut for a tutorial.

    Edit

    The arrow operator -> can also be used to dereference an array or an hash

    $array_ref->[0]
    

    or

    $hash_ref->{key}
    

    See man perlop for details