scmuser created the topic: Why we use ‘use strict’ in perl
Hi,
Why you should ‘use strict’? what is the significant of “strict” in out module?
rajeshkumar replied the topic: Re: Why we use ‘use strict’ in perl
Whenever your program gets over a few lines long, definitely when you can’t view the whole program on one page, or sometimes when you just can’t figure out what else could be wrong.
To help you catch typos so you can quickly get on to finding more significant problems (and so we don’t have to catch the typos for you either), among other reasons.
Its difficult to spot ‘$recieve_date’ when on the previous page you’ve been calling it ‘$receive_date’. Also, to give your variables as small a scope as possible so that you don’t have to worry about what they’re doing to other parts of your program (although that’s the function of my, it forces you to use my which when properly used helps achieve this goal).
Put this line at the top of your script (after the shebang, e.g., ‘#!/usr/bin/perl’ line):
use strict;
# Change this:
$string = "hello world";
@array = qw(ABC DEF);
%hash = (A=>1, B=>2);
# To this:
my $string = "hello world";
my @array = qw(ABC DEF);
my %hash = (A=>1, B=>2);
# Change this:
# '$name' is global here
foreach $name (@names) {
print "Name: $name\n";
}
# To this:
foreach my $name (@names) {
# Now '$name' only exists in this block
print "Name: $name\n";
}
# Change this:
# Likewise, '$digit' is global here
foreach $digit (@digits) {
$number = 10*$number + $digit;
}
print "Number: $number\n";
# To this (variables used in an outer scope ('$number')
# will have to be declared in an outer scope):
my $number = 0;
foreach my $digit (@digits)
# Now '$digit' only exists in this block
$number = 10*$number + $digit;
}
print "Number: $number\n";
# Change this:
sub my_sub {
($arg1, $arg2) = @_;
print "Arg1: $arg1 Arg2: $arg2\n";
}
# To this:
sub my_sub {
my ($arg1, $arg2) = @_;
print "Arg1: $arg1 Arg2: $arg2\n";
}
# Using DBI? You can change this:
$sth->bind_columns(\$field1, \$field2);
while ($sth->fetch) {
print "F1: $field1 F2: $field2\n";
}
# To this (the '\' is distributed over a list of values):
$sth->bind_columns(\my ($field1, $field2));
while ($sth->fetch) {
print "F1: $field1 F2: $field2\n";
}
Regards,
Rajesh Kumar
Twitt me @ twitter.com/RajeshKumarIn
rajeshkumar replied the topic: Re: Why we use ‘use strict’ in perl
Some More Helpful info…
By default Perl allows you to use variables without declaring them. This may be convenient for short scripts and one-liners.But in a longer unit of code such as a module it is wise to declare your variables both to catch typos and to constrain their accessibility appropriately from outside the module. The strict pragmaforces you to declare your variables.
If no import list is supplied, all possible restrictions are assumed. (This is the safest mode to operate in, but is sometimes too strict for casual programming.) Currently, there are three possible things to be strict about: “subs”, “vars”, and “refs”.
strict refs
This generates a runtime error if you use symbolic references
1. use strict ‘refs’;
2. $ref = \$foo;
3. print $$ref; # ok
4. $ref = “foo”;
5. print $$ref; # runtime error; normally ok
6. $file = “STDOUT”;
7. print $file “Hi!”; # error; note: no comma after $file
strict vars
This generates a compile-time error if you access a variable that wasn’t declared via our or use vars , localized via my(), or wasn’t fully qualified. Because this is to avoid variable suicide problems and subtle dynamic scoping issues, a merely local() variable isn’t good enough.
1. use strict ‘vars’;
2. $X::foo = 1; # ok, fully qualified
3. my $foo = 10; # ok, my() var
4. local $foo = 9; # blows up
5.
6. package Cinna;
7. our $bar; # Declares $bar in current package
8. $bar = ‘HgS’; # ok, global declared via pragma
strict subs
This disables the poetry optimization, generating a compile-time error if you try to use a bareword identifier that’s not a subroutine, unless it is a simple identifier (no colons) and that it appears in curly braces or on the left hand side of the => symbol
1. use strict ‘subs’;
2. $SIG{PIPE} = Plumber; # blows up
3. $SIG{PIPE} = “Plumber”; # just fine: quoted string is always ok
4. $SIG{PIPE} = \&Plumber; # preferred form
Regards,
Rajesh Kumar
Twitt me @ twitter.com/RajeshKumarIn
Tagged : Perl