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-PL-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.
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 |
Related Guidelines
| SEI CERT C Coding Standard | DCL37-C. Do not declare or define a reserved identifier |
|---|---|
| SEI CERT C++ Coding Standard | DCL51-CPP. Do not declare or define a reserved identifier |
Bibliography
| [Conway 2005] | "Homonyms," p. 177 |
| [CPAN] | Elliot Shank, Perl-Critic-1.116 Subroutines::ProhibitBuiltinHomonyms |
| [Wall 2011] | perlfunc, perlsyn |


