Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
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 chilling in the Monastery: (7)
As of 2015-07-04 02:26 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (57 votes), past polls