Beefy Boxes and Bandwidth Generously Provided by pair Networks
We don't bite newbies here... much
 
PerlMonks  

Re^10: Thx, St. Larry, for the Beauty of Sigils

by shmem (Chancellor)
on Jul 27, 2019 at 21:25 UTC ( #11103519=note: print w/replies, xml ) Need Help??


in reply to Re^9: Thx, St. Larry, for the Beauty of Sigils
in thread Thx, St. Larry, for the Beauty of Sigils

Well yes that's how it's implemented in Perl - and other languages like Python or JS too - but doesn't help comparing languages.

They all store references into their "namespaces" or "lexical pads"

...

and anonymous" only refers to the literal array or {hash} constructors not to the scalar on the LHS of an assignment.

perldata states:

Values are usually referred to by name, or through a named reference.

So the LHS in $ary = [1,2,3] is a named reference; it is a named variable. The RHS is an anonymous array, at least that is what is called throughout the perl documentation. So let's stick to that to avoid confusion.

The difference is not "named" or "unnamed", but explicit or implicit dereferencing.

Difference between languages, but not in perl.

In perl, the scalar $ary may hold an anonymous array. But @ary is a named array. Perl does no implicit derefrencing, and so the syntax to access slots of the named array @ary necessarily has to be distinct from the one to access a slot of the anonymous array stored in the named scalar variable $ary - or of any anonymous array:

my $result = [ func(@args) ]->[2];

So in perl - at least that is how I understand perl for a couple of decades now - the difference is between named and anonymous variables. To get hold of an anonymous variable beyond a single statement, its reference has to be stored in a named scalar variable.

But I'm not going on telling you stuff you know as well as I do, only to get reverse 'halb' back, and I won't argue any more, since there is no point but frustration. Let's close this sub-thread. Thank you.

update

) or scalars, but this can't be easily written *scalar = \1 is not the same thing

Of course not, because that makes a reference from a constant. A variable reference is needed to make it variable:

*scalar = \do { my $x = 1 };

The expression *scalar = \"foo bar" creates a package constant (readonly package variable) $scalar (but *scalar = \"Hello $world" doesn't, it's r/w :-).

perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

Replies are listed 'Best First'.
Re^11: Thx, St. Larry, for the Beauty of Sigils
by LanX (Archbishop) on Jul 28, 2019 at 10:36 UTC
    I have trouble calling something "anonymous" which is accessible by a named variable.

    perlglossary states

    anonymous

    Used to describe a referent that is not directly accessible through a named variable. Such a referent must be indirectly accessible through at least one hard reference. When the last hard reference goes away, the anonymous referent is destroyed without pity.

    But I just recalled that Perl tends to use the label "__ANON__" for subs which were not bound to a package at creation time (i.e. created the usual way with sub name {} )

    DB<22> use Carp qw/confess/ DB<23> $inner = sub { confess "INNER" } DB<24> sub outer { $inner->() } DB<25> outer() INNER at (eval 32)[C:/Perl_524/lib/perl5db.pl:737] line 2. main::__ANON__[(eval 32)[C:/Perl_524/lib/perl5db.pl:737]:2]() +called at (eval 33)[C:/Perl_524/lib/perl5db.pl:737] line 2 main::outer() called at (eval 34)[C:/Perl_524/lib/perl5db.pl:7 +37] line 2 ... #shortened outer(); ... #shortened DB<26> *inner = $inner DB<27> inner() INNER at (eval 32)[C:/Perl_524/lib/perl5db.pl:737] line 2. main::__ANON__[(eval 32)[C:/Perl_524/lib/perl5db.pl:737]:2]() +called at (eval 36)[C:/Perl_524/lib/perl5db.pl:737] line 2 ... #shortened inner(); ... #shortened

    I think this is a confusing terminology which might have made sense in the time of Perl4.

    But I see your point now.

    Cheers Rolf
    (addicted to the Perl Programming Language :)
    Wikisyntax for the Monastery FootballPerl is like chess, only without the dice

    PS: Would be interesting to know if lexical subs are handled correctly here. (UPDATE: yes they are)

      I think this is a confusing terminology which might have made sense in the time of Perl4.

      perl 4 did not have references at all. Back in those days building structures, e.g. multilevel hashes, was cumbersome. One leftover of these days is the global $SUBSEP or $; (see perlvar). References were introduced with perl5.0 which was a big step forward.

      update

      Regarding the block you quote from perlglossary - that's why I said To get hold of an anonymous variable beyond a single statement, its reference has to be stored in a named scalar variable..

      What the paragraph doesn't mention is that anonymous variables which are created but not stored somewhere keep hanging around, unaccessible, until their scope ends, i.e. their reference count is increased at creation time. Consider:

      use 5.10.0; $| = 1; # make a scalar reference (blessed for DESTROY to be triggered) say bless \do { my $x }; # anonymous scalar gone? nope! say "done"; sub DESTROY { warn "destroying $_[0]\n"; } __END__ main=SCALAR(0x55f1ce2d6450) done destroying main=SCALAR(0x55f1ce2d6450)

      versus

      use 5.10.0; $| = 1; { # make a scalar reference (blessed for DESTROY to be triggered) say bless \do { my $x }; } # anonymous scalar gone! say "done"; sub DESTROY { warn "destroying $_[0]\n"; } __END__ main=SCALAR(0x563bee102450) destroying main=SCALAR(0x563bee102450) done

      This is arguably a bug.

      perl -le'print map{pack c,($-++?1:13)+ord}split//,ESEL'

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://11103519]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others pondering the Monastery: (6)
As of 2020-06-03 12:21 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?
    Do you really want to know if there is extraterrestrial life?



    Results (23 votes). Check out past polls.

    Notices?