Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Dear smart monks, here are two lines of code:
sub some_sub { my ($pkg) = caller; @{"${pkg}::_ATTR"} = @_; ... }
I don't understand why the $pkg was used with "{}" arround it before "$". could someone give me a hint or where to look for the anwser? thanks a lot,

Replies are listed 'Best First'.
Re: why the variable is used this way?
by Corion (Patriarch) on Oct 30, 2005 at 18:58 UTC

    Perl needs to know that you want to interpolate $pkg and not $pkg::_ATTR, which would be the variable $_ATTR in the package pkg. Another way to tell Perl to ignore the colons is the following:

    @{"$pkg\::_ATTR"} = @_

    which is not necessarily less obfuscated though.

    As a small example of the differences, look at the following:

    package pkg; $_ATTR = 'I am $_ATTR from ' . __PACKAGE__; package main; $pkg = 'I am $pkg from ' . __PACKAGE__; print "1. $pkg::_ATTR\n"; print "2. $pkg\::_ATTR\n"; print "3. ${pkg}::_ATTR\n";
      which is not necessarily less obfuscated though.

      Yet another way which is, perhaps, a little more clear:

      @{$pkg . '::_ATTR'} = @_;
      It's probably expected, though, that anyone reading or changing code using caller and symbolic refs will understand the other forms.

      -sauoq
      "My two cents aren't worth a dime.";
      
      Thanks, Corion. that helped me a lot. serah
Re: why the variable is used this way?
by bobf (Monsignor) on Oct 31, 2005 at 03:17 UTC

    While Corion already answered your first question, a link to the appropriate doc would answer your second question. See perldata, specifically the section on scalar value constructors (excerpt follows for convenience):

    As in some shells, you can enclose the variable name in braces to disambiguate it from following alphanumerics (and underscores). You must also do this when interpolating a variable into a string to separate the variable name from a following double-colon or an apostrophe, since these would be otherwise treated as a package separator:
    $who = "Larry"; print PASSWD "${who}::0:0:Superuser:/:/bin/perl\n"; print "We use ${who}speak when ${who}'s here.\n";
    Without the braces, Perl would have looked for a $whospeak, a $who::0, and a $who's variable. The last two would be the $0 and the $s variables in the (presumably) non-existent package who.

    In fact, an identifier within such curlies is forced to be a string, as is any simple identifier within a hash subscript. Neither need quoting. Our earlier example, $days{'Feb'} can be written as $days{Feb} and the quotes will be assumed automatically. But anything more complicated in the subscript will be interpreted as an expression.

    HTH