Beefy Boxes and Bandwidth Generously Provided by pair Networks
laziness, impatience, and hubris
 
PerlMonks  

Re: Strict to references of a particular Variable of particular type.

by Roger (Parson)
on Dec 02, 2005 at 12:59 UTC ( #513582=note: print w/ replies, xml ) Need Help??


in reply to Strict to references of a particular Variable of particular type.

It's always a good practise to check your input parameters inside your subroutine. Even in C/C++ you need to check if a pointer is NULL. This is called defensive programming. A module programmer must always assume that what might go wrong will go wrong. Explicit checking is always necessary to produce robust code.

Perl supports prototype checking (although many people choose not to use it). For example, sub foo($); tells Perl that the subroutine 'foo' only takes a single scalar as parameter. If you pass other data type into the sub, Perl will complain. Combining prototyping and explcit checking, you can make your module more robust.

By the way, ref(@_) is not going to do what you think it will do. You would need to do something along the lines of:

#!/usr/bin/perl -w use strict; use Carp; use Data::Dumper; sub array_ref { my $array_ref = shift; croak 'Not an array reference' unless ref($array_ref) eq 'ARRAY'; print Dumper($array_ref); } my @array = qw/ 1 2 3 4 5 /; my %hash = qw/ 1 1 2 2 3 3 4 4 5 5 /; array_ref(\@array); array_ref(\%hash);
and the output
$VAR1 = [ '1', '2', '3', '4', '5' ]; Not an array reference at try.pl line 9 main::array_ref('HASH(0x81d4e14)') called at try.pl line 18

Update: crossed out the section on Perl prototype checking


Comment on Re: Strict to references of a particular Variable of particular type.
Select or Download Code
Re^2: Strict to references of a particular Variable of particular type.
by Corion (Pope) on Dec 02, 2005 at 13:03 UTC

    People avoid prototypes for enforcing argument types and argument count because prototypes do not enforce argument types or argument count:

    sub foo ($) { print ">>$_[0]<<\n"; }; my @bar = (4,5,6); foo 1,2,3; foo @bar; foo(@bar);

    I forgot to point to Tom Christiansens Far More Than You Ever Wanted To Know About Prototypes - it details the uses and abuses of prototypes, and my rule of thumb has been to avoid them unless I really need them.

      Thanks for the clarification. The example was very helpful.

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://513582]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others exploiting the Monastery: (7)
As of 2014-10-01 06:58 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    How do you remember the number of days in each month?











    Results (389 votes), past polls