You are viewing an old version of this page. View the current version.

Compare with Current View Page History

« Previous Version 16 Next »

Perl has a large number of built-in functions; they are described on the perlfunc manpage [Wall 2011]. Perl also has a handful of reserved keywords such as while; they are described on the perlsyn manpage [Wall 2011].

Do not use an identifier for a subroutine that has been reserved for a built-in function or keyword.

Noncompliant Code Example

This noncompliant code example codes a subroutine called open(), which clashes with the open() built-in function.

sub open {
  my ($arg1, $arg2, $arg3) = @_;
  print "arg1 = $arg1\n";
  print "arg2 = $arg2\n";
  print "arg3 = $arg3\n";
}

open( my $input, "<", "foo.txt");     # What does this do?

Perl (v5.12.1) actually invokes the built-in open() rather than the newly crafted subroutine.

Compliant Solution

This compliant solution uses a different name for its subroutine; consequently, it behaves as expected.

sub my_open {
  my ($arg1, $arg2, $arg3) = @_;
  print "arg1 = $arg1\n";
  print "arg2 = $arg2\n";
  print "arg3 = $arg3\n";
}

my_open( my $input, "<", "foo.txt");

Exceptions

DCL31-EX0: This rule does not apply to object methods. Object methods are easy for the parser to distinguish from built-in functions or keywords because of their distinct syntax.

Related Guidelines

Risk Assessment

Using reserved keywords can lead to unexpected program behavior and surprising results.

Recommendation

Severity

Likelihood

Remediation Cost

Priority

Level

DCL31-PL

Low

Probable

Medium

P4

L3

Automated Detection

Tool

Diagnostic

Perl::Critic

Subroutines::ProhibitBuiltinHomonyms

Bibliography

 


  • No labels