On 8/30/07, Martin Barth <[EMAIL PROTECTED]> wrote:
> On Thu, 30 Aug 2007 15:39:14 +0100
> Andrew Curry <[EMAIL PROTECTED]> wrote:
>
> > That's rubbish,
>
> but you get a warning like:
>
> main::a() called too early to check prototype at -e line 1.
>
> Use Prototypes at the beginning of your file if you want to write the
>subs at the end.
snip
This would be a good point but for the fact that prototypes are
fundamentally broken* in Perl 5 and should not be used except in very
specific cases.
Here is a few things to consider before using prototypes:
#!/usr/bin/perl
use strict;
use warnings;
sub foo ($) {
my $s = shift;
print "$s\n";
}
my @a = qw<a b c d e>;
print "with a prototype\n";
#this not an error
#do you know why?
foo(@a);
my $sub = \&foo;
#this isn't an error either,
#but it gets different results
#do you know why?
$sub->(@a);
#this won't error
#for the same reason
&foo($a[0], $a[1], $a[2]);
#this is also not an error
#but it produces yet another result
#do you know why?
foo(@a[0 .. $#a]);
#lets see what happens without prototypes
print "without a prototype\n";
bar(@a);
$sub = \&bar;
$sub->(@a);
&bar($a[0], $a[1], $a[2]);
bar(@a[0 .. $#a]);
sub bar {
my $s = shift;
print "$s\n";
}
* well, this is a bit harsh, they just don't do what most people
expect them to do.
--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
http://learn.perl.org/