Beefy Boxes and Bandwidth Generously Provided by pair Networks
Syntactic Confectionery Delight
 
PerlMonks  

Re: Re: Never lock $0 inside of a BEGIN block

by demerphq (Chancellor)
on May 21, 2003 at 20:50 UTC ( #259880=note: print w/ replies, xml ) Need Help??


in reply to Re: Never lock $0 inside of a BEGIN block
in thread Never lock $0 inside of a BEGIN block

Why does

1 #!perl 2 # Utility vars 3 4 my $foo="Hello there" 5 6 # End utility vars. When do we make these go away? 7 8 ###################################################### 9 # We loop over each character and print them out 10 # this is mostly so that we can do the fnorzle with 11 # boopat over the dulwhup. Which can really pjorn your 12 # noodle 13 14 15 for my $i (0.. length($foo)-1) { 16 print "$i ",substr($foo,$i,1),"\n"; 17 }

produce the following error

syntax error at D:\perl\scratch\errors.pl line 15, near "$i (" Execution of D:\perl\scratch\errors.pl aborted due to compilation erro +rs.

I dont see why this doesn't produce something more intelligent. My general rule for perl errors is that if I don't see the problem immediately on the line that perl tells me I look on the one before, and as the contrived example shows here that can be quite a ways before.

:-)


---
demerphq

<Elian> And I do take a kind of perverse pleasure in having an OO assembly language...


Comment on Re: Re: Never lock $0 inside of a BEGIN block
Select or Download Code
Re: Re: Re: Never lock $0 inside of a BEGIN block
by halley (Prior) on May 21, 2003 at 20:55 UTC

    Because the following syntax is valid (even if nonsensical):

    my $foo = "Hello there" for (1 .. 3);
    An upshot of the modifier forms of 'for' and 'if' is that you can make C-style static variables with
    sub blah { my $foo if 0; print $foo++,$/; } blah(),blah(),blah();
    Though Larry says it's an accident of implementation that this works...

    --
    [ e d @ h a l l e y . c c ]

      Heh. Ive encountered a bunch of weirdness with using my and modifiers. (I've even argued that it should produce a warning.) I haven't seen the static variable trick. Thats scary. Cool Scary though. :-)

      However I'm still not convinced that this error message couldn't be improved.

      BTW, the static trick only works with if 0; and for (); and thus I still consider it something that should produce a warning.

      # No assignment #With assignment for_blah 0 for_blah 0 for_blah 0 for_blah 0 for_blah 0 for_blah 0 --- --- not_for_blah 0 not_for_blah 0 not_for_blah 1 not_for_blah 1 not_for_blah 2 not_for_blah 2 --- --- if_blah 0 if_blah 1 if_blah 0 if_blah 1 if_blah 0 if_blah 1 --- --- not_if_blah 0 not_if_blah 0 not_if_blah 1 not_if_blah 1 not_if_blah 2 not_if_blah 2 --- ---

      ---
      demerphq

      <Elian> And I do take a kind of perverse pleasure in having an OO assembly language...
        BTW, the static trick only works with if 0; and for ();

        Not so. Observe:

        #!/usr/local/bin/perl -l sub horror { my $foo if "reset" eq shift; print ++$foo; } horror($_) for qw(foo bar baz reset bing bang boom); __END__ 1 2 3 4 1 2 3

        (Not that the sub name is intended as an editorial comment, or anything... <grin>)

        The nasty part is just that the cleanup (resetting $foo to undef) takes place at the end of the iteration in which my $foo is actually executed (which isn't exactly what you'd expect from a "reset" argument, but that's what you get with silly example code).



        If God had meant us to fly, he would *never* have given us the railroads.
            --Michael Flanders

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others wandering the Monastery: (7)
As of 2014-09-23 05:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (210 votes), past polls