in reply to eval strings non reentrant?

Perl syntax is complexer than we think, since simple things can have multiple means. A word, in your case "foo", declared as it was, can be:
foo = sub foo {} foo = string "foo" foo = IO handler *foo foo = constant, that actually is: sub foo { "constant" }
So, when the Perl syntax is parsed, first it will check if we have a sub with that name, if not, it will treat it as a string. As you can see, in your code, sub foo will return the string "foo".

Next time, when calling a function, always use () or &:

foo() # or &foo # that is the same of foo(@_) # or just to be explicit: &foo()
Take a look in perlsub... And http://perldoc.com is your friend.

Now about the messages of the "use strict" & "use warning" corporation, forget, since know that we need to use that doesn't means that we are goo programmers. There's a lot of things that we can't do with all the strict options enabled, and with all the warnings enabled. And Perl is here to let the developer to be free.

But use at least "use strict qw(vars)" will save you a lot of time.

Graciliano M. P.
"Creativity is the expression of the liberty".

Replies are listed 'Best First'.
Re: Re: eval strings non reentrant?
by gmishra (Sexton) on Jun 02, 2004 at 06:25 UTC
    guess this would work.. some small changes.. not too complex
    $e = "my \$i=0; sub foo{ print \"\$i foo\\n\"; if (\$i < 10){ \$i++; print \"calling foo\\n\"; &foo; } } &foo\;"; eval "$e"; print $@

    tc,
    Garry
      Note that &foo will send the same arguments received by the function, since &foo is the same to write foo(@_), and is not the same of foo()!

      Graciliano M. P.
      "Creativity is the expression of the liberty".