in reply to Re: DESTROY problem
in thread DESTROY problem

I am curious about something I noticed in your solution. How come you can save a method name as a string and use the variable containing the string to call the method, like this:

use strict; use warnings; use 5.010; {package Cow; sub speak { say "Mooo."; } } my $meth_name = "speak"; Cow->$meth_name; --output:-- Mooo.

but you can't use the string literal itself to call the method?

Cow->"speak"; --output:-- String found where operator expected at C:\Users\Me\Documents\perl2.pl + line 13, near "->"speak"" (Missing operator before "speak"?) syntax error at C:\Users\Me\Documents\perl2.pl line 13, near "->"speak +"" Execution of C:\Users\Me\Documents\perl2.pl aborted due to compilation + errors.

Replies are listed 'Best First'.
Re^3: DESTROY problem
by Mr. Muskrat (Canon) on Jan 01, 2011 at 18:04 UTC

    Here's something to ponder. Can you use a quoted string as a subroutine name? If you don't know, figure that out and then you will have your answer.

      Can you use a quoted string as a subroutine name?
      Yes.
      sub foo {say "Hello"} "foo"->(); __END__ Hello
      The reason you cannot use a quoted string, or a general expression, is the limited amount of tokes that can follow an arrow. Based on token on the right hand side of an arrow, it's decided at compile time what kind of dereference it is. Think about it, if it where delayed till run time,
      $arrayref->[1];
      the arrow would be a binary operator with two array references on either side.

      Note that this works:

      sub Foo::foo {say "Hello"}; bless [], "Foo"->${\"foo"}; __END__ Hello