in reply to Re^5: Prototype for constant items???
in thread Prototype for constant items???

You can't expect to tell the difference between the size of an array (such as '3'), and a plain old number (such as '3').

Again: I can tell the difference between scalar and an array, but just not for constants.

You're still missing the point ... I marked it for you, to make it clearer:

DB<4> sub tst (\[$@]) { print ref $_[0] } DB<5> $a="a";@a=(1..3) DB<6> tst $a SCALAR DB<7> tst @a ARRAY DB<8> tst "a" # <--------- that's the point ! Type of arg 1 to main::tst must be one of [$@] (not constant item) at +(eval 12)[/usr/share/perl/5.10/perl5db.pl:638] line 2, at EOF

Cheers Rolf

Replies are listed 'Best First'.
Re^7: Prototype for constant items???
by SuicideJunkie (Vicar) on Sep 28, 2009 at 13:53 UTC

    The problem there, is that you are still using prototypes. I am saying; ditch that, and just check the parameters in the sub.

    If the caller wants to pass an array as the first parameter, they can throw a reference slash in front of it, or square brackets around it. If they want to pass a list of multiple parameters, they can just pop the ($alpha,@rgb) in there without your sub forcing it into just two parameters and then trying to untangle it later.

    My main point: Use prototypes if you want to mangle the caller's code. Use if croak, warn, etc if you want to do type and sanity checking.

    Note: If they pass an array where they should have passed an arrayRef, then you should croak with a detailed version of "Too Many Parameters!" and/or "Value out of range", where applicable.

    Come to think of it, it would be nice to have a template of:

    sub foo { my $failed; ($failed = 1 and carp "First Parameter must be greater than zero") i +f $_[0] <= 0; ($failed = 1 and carp "Too many parameters") if scalar @_ > 3; die "Invalid parameters; cannot continue" if $failed; ... }
    since that would print out all of the errors before stopping, rather than just one error per run.