Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

Perl functions can be invoked in two contexts: list and scalar. These contexts indicate what is to be done with the return value. Functions can return different values in list context than in scalar context. For instance, the grep() function takes a list and a block or expression , and filters out elements of the list for whom which the block or expression evaluates to false. The grep() function returns the filtered list when called in list context, but when called in scalar context, it merely returns the size of this list. That is, it returns the number of elements for whom which the block or expression evalues evaluates to true.

Some functions do not define what they return in list or scalar context. For instance, according to the {[perlfunc}} manpage, the sort() function "sorts the LIST and returns the sorted list value. In scalar context, the behaviour behavior of "'sort()" ' is undefined.".

Do not invoke a function in a context for which it is undefined.

Noncompliant Code Example (sort())

This noncompliant code example inadvertantly inadvertently assigns a scalar to the result of the sort() function.

Code Block
bgColor#ffcccc
langperl

sub ret {
  my $list = shift;
  my @list = @{$list};
  # ...
  return sort @list;
}

my @list = ( "foo", "bar", "baz");
my $result = ret @list;

The contents of $result are undefined , because the sort() function's return value is not defined in a scalar context.

Compliant Solution (sort())

This compliant solution guarantees that the ret() function is called only called in list context.

Code Block
bgColor#ccccff
langperl

sub ret {
  my $list = shift;
  my @list = @{$list};
  # ...
  return sort @list;
}

my @list = ( "foo", "bar", "baz");
my @result = ret @list;

In this case, the @result array will contain the list {{ {"bar", "baz", "foo" }}}.

Risk Assessment

Using an unspecified value can lead to erratic program behavior.

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

EXP33-PL

medium Medium

unlikely Unlikely

low Low

P2 P6

L3 L2

Automated Detection

Tool

Diagnostic

Perl::Critic

Subroutines::ProhibitReturnSort

Bibliography

...

[

...

...

 

...

Image Added Image Added Image Added\] \[[Manpages|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