Dan Anderson wrote:

> What is really driving me bonkers is if I try the following code:
> 
> use strict;
> use warnings;
> 
> END
> {
>     print "Look ma, i'm using subroutines!";
>     foo::foo();
> }
> 
> BEGIN
> {
>     print "\nouter\n";
>     BEGIN
>     { print "\ninner\n"; }
> }
> print "end\n";
> 
> 
> BEGIN
> {
>     package foo;
>     foo();
>     BEGIN
>     {
> sub foo()
> { print "\nfoo\n"; }
>     }
> }
> 
> I get:
> 
> 
> inner
> 
> outer
> foo::foo() called too early to check prototype at ./ad_module.pl line
> 21.
> 
> foo
> end
> Look ma, i'm using subroutines!
> foo
> 
> I don't understand why if BEGIN blocks can have different priorities a
> warning would be put out.  

the warning you see actually has very little to do with being inside the 
BEGIN{} block. even without the begin block:

#!/usr/bin/perl -w
use strict;

fun;
sub fun(){
        print "hi\n";
}

__END__

still generate the same wanring:

main::fun() called too early to check prototype at ./tmp.pl line 14.
hi

if you don't want to see the warning, you can disable prototype:

#!/usr/bin/perl -w
use strict;

BEGIN{
        &fun;
        BEGIN{
                sub fun(){
                        print "hi\n";
                }
        }
}

__END__ 

prints:

hi

generally speaking, '&fun' is NOT the same as 'fun()' but in this case, it 
doesn't make any difference.

BEGIN{} block are executed in FIFO (first in first out) order and END{} 
block are executed in LIFO (last in first out) order.

david
-- 
$_=q,015001450154015401570040016701570162015401440041,,*,=*|=*_,split+local$";
map{~$_&1&&{$,<<=1,[EMAIL PROTECTED]||3])=>~}}0..s~.~~g-1;*_=*#,

goto=>print+eval

-- 
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to