I have a Perl file like this:
use strict;
f1();
sub f3()
{ f2(); }
sub f1()
{}
sub f2()
{}
In short, f1
is called before it is d
When you define a function in Perl you should not use parentheses. When you do so you get this error. This is wrong:
sub DoSomthing(){
#do what ever...
}
This is the way to go:
sub DoSomthing{
#do what ever...
}
no parentheses.
For more detailed explenation see Gabor Szabo's Perl Maven page on Subroutines and functions in Perl. https://perlmaven.com/subroutines-and-functions-in-perl
The lack of a warning on the call to f2()
from f3()
appears to be a bug.
use strict;
use warnings;
f1();
sub f1 {
my @a = qw(a b c);
f2(@a);
}
sub f2(\@) { print $_[0] }
This prints "a". If you either predeclare f2()
or swap the order of the subroutine definitions, it prints "ARRAY(0x182c054)".
As for resolving the situation, it depends. My preferences (in order) would be:
&foo()
notation to bypass prototype checking.Simply remove the () from your subroutine definitions. When you define with (), Perl thinks these are prototypes and you have to define your prototype before you use it.
Try this......
use strict;
f1();
sub f3
{ f2(); }
sub f1
{}
sub f2
{}
You can completely avoid this issue by not using prototypes in the first place:
use strict;
f1();
sub f3 { f2() }
sub f1 {}
sub f2 {}
Don't use prototypes unless you know why you are using them:
This is all very powerful, of course, and should be used only in moderation to make the world a better place.
If you are going to call it with the parenthesis, why are you even using prototypes?
sub f1(){ ... }
f1();
The only time I would use the empty prototype is for a subroutine that I want to work like a constant.
sub PI(){ 3.14159 }
print 'I like ', PI, ", don't you?\n";
I would actually recommend against using Perl 5 prototypes, unless you want your subroutine to behave differently than it would otherwise.
sub rad2deg($){ ... }
say '6.2831 radians is equal to ', rad2deg 6.2831, " degrees, of course.\n";
In this example, you would have to use parenthesis, if it didn't have a prototype. Otherwise it would have gotten an extra argument, and the last string would never get printed.