Perl has two contexts in which expressions can be evaluated: scalar , and list. These contexts actually determine what the expression generates. It is recommended that the context be made explicit when an expression is evaluated in an unexpected context, that the context be made explicit. Implicit context switching makes programs difficult to read and more error prone.
...
Code Block | ||||
---|---|---|---|---|
| ||||
sub print_array {
my $array = shift;
print "( ";
foreach $item (@{$array}) {
print "$item , ";
}
print ")\n";
}
my @array; # initialize
my $array_ref = @array;
print_array( $array_ref);
|
The developer mistakenly left out the }} \
indicator when initializing {{$array_ref
. Consequently, it contains not instead of a reference to the array, but rather it contains the number of elements in the array. When passed to the print_array()
subroutine, this program prints an empty array.
...
Code Block | ||||
---|---|---|---|---|
| ||||
my $array_ref = \@array;
print_array( $array_ref);
|
...
Code Block | ||||
---|---|---|---|---|
| ||||
my @array; # initialize
my $cardinality = @array;
print "The array has $cardinality elements\n";
|
While Although this program works correctly, there are less ambiguous ways to obtain the number of elements of an array can be obtained in less ambiguous ways.
Compliant Solution (scalar()
)
This compliant solution uses the scalar()
builtin built-in subroutine to obtain the number of elements of an array.
Code Block | ||||
---|---|---|---|---|
| ||||
my $cardinality = scalar( @array);
print "The array has $cardinality elements\n";
|
This compliant solution again evaluates @array
in scalar context just like as in the noncompliant code example. However, the scalar()
makes this evaluation explicit, removing any doubt as to the programmer's intentions.
...
Code Block | ||||
---|---|---|---|---|
| ||||
my $cardinality = $#array + 1;
print "The array has $cardinality elements\n";
|
...
Recommendation | Severity | Likelihood | Remediation Cost | Priority | Level |
---|---|---|---|---|---|
EXP05EXP06-PL | low | unlikely | medium | P2 | L3 |
Automated Detection
Tool | Diagnostic |
---|---|
B::Lint | context |
Bibliography
...
...
] | |
---|---|
[CPAN] | Elliot Shank, Perl-Critic-1.116, ProhibitBooleanGrep |
[Conway 2005] | "Lists," p. 71 |
[Wall 2011] | perlfunc |
...
|http://search.cpan.org/~elliotjs/Perl-Critic-1.116/]. [ProhibitBooleanGrep|http://search.cpan.org/dist/Perl-Critic/lib/Perl/Critic/Policy/BuiltinFunctions/ProhibitBooleanGrep.pm]. \[[Conway 2005|AA. Bibliography#Conway 2005]\], pg 71 \[[Wall 2011|AA. Bibliography#Manpages]\] [perlfunc|http://perldoc.perl.org/perlfunc.html]EXP11-C. Do not apply operators expecting one type to data of an incompatible type 03. Expressions (EXP) EXP13-C. Treat relational and equality operators as if they were nonassociative