.\" Automatically generated by Pod::Man 4.14 (Pod::Simple 3.40) .\" .\" Standard preamble: .\" ======================================================================== .de Sp \" Vertical space (when we can't use .PP) .if t .sp .5v .if n .sp .. .de Vb \" Begin verbatim text .ft CW .nf .ne \\$1 .. .de Ve \" End verbatim text .ft R .fi .. .\" Set up some character translations and predefined strings. \*(-- will .\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left .\" double quote, and \*(R" will give a right double quote. \*(C+ will .\" give a nicer C++. Capital omega is used to do unbreakable dashes and .\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, .\" nothing in troff, for use with C<>. .tr \(*W- .ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' .ie n \{\ . ds -- \(*W- . ds PI pi . if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch . if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch . ds L" "" . ds R" "" . ds C` "" . ds C' "" 'br\} .el\{\ . ds -- \|\(em\| . ds PI \(*p . ds L" `` . ds R" '' . ds C` . ds C' 'br\} .\" .\" Escape single quotes in literal strings from groff's Unicode transform. .ie \n(.g .ds Aq \(aq .el .ds Aq ' .\" .\" If the F register is >0, we'll generate index entries on stderr for .\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index .\" entries marked with X<> in POD. Of course, you'll have to process the .\" output yourself in some meaningful fashion. .\" .\" Avoid warning from groff about undefined register 'F'. .de IX .. .nr rF 0 .if \n(.g .if rF .nr rF 1 .if (\n(rF:(\n(.g==0)) \{\ . if \nF \{\ . de IX . tm Index:\\$1\t\\n%\t"\\$2" .. . if !\nF==2 \{\ . nr % 0 . nr F 2 . \} . \} .\} .rr rF .\" .\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). .\" Fear. Run. Save yourself. No user-serviceable parts. . \" fudge factors for nroff and troff .if n \{\ . ds #H 0 . ds #V .8m . ds #F .3m . ds #[ \f1 . ds #] \fP .\} .if t \{\ . ds #H ((1u-(\\\\n(.fu%2u))*.13m) . ds #V .6m . ds #F 0 . ds #[ \& . ds #] \& .\} . \" simple accents for nroff and troff .if n \{\ . ds ' \& . ds ` \& . ds ^ \& . ds , \& . ds ~ ~ . ds / .\} .if t \{\ . ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" . ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' . ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' . ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' . ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' . ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' .\} . \" troff and (daisy-wheel) nroff accents .ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' .ds 8 \h'\*(#H'\(*b\h'-\*(#H' .ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] .ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' .ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' .ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] .ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] .ds ae a\h'-(\w'a'u*4/10)'e .ds Ae A\h'-(\w'A'u*4/10)'E . \" corrections for vroff .if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' .if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' . \" for low resolution devices (crt and lpr) .if \n(.H>23 .if \n(.V>19 \ \{\ . ds : e . ds 8 ss . ds o a . ds d- d\h'-1'\(ga . ds D- D\h'-1'\(hy . ds th \o'bp' . ds Th \o'LP' . ds ae ae . ds Ae AE .\} .rm #[ #] #H #V #F C .\" ======================================================================== .\" .IX Title "Perl::Critic::Policy::Freenode::DeprecatedFeatures 3pm" .TH Perl::Critic::Policy::Freenode::DeprecatedFeatures 3pm "2020-12-26" "perl v5.32.0" "User Contributed Perl Documentation" .\" For nroff, turn off justification. Always turn off hyphenation; it makes .\" way too many mistakes in technical documents. .if n .ad l .nh .SH "NAME" Perl::Critic::Policy::Freenode::DeprecatedFeatures \- Avoid features that have been deprecated or removed from Perl .SH "DESCRIPTION" .IX Header "DESCRIPTION" While Perl::Critic::Policy::Freenode::StrictWarnings will expose usage of deprecated or removed features when a modern perl is used, this policy will detect such features in use regardless of perl version, to assist in keeping your code modern and forward-compatible. .SH "FEATURES" .IX Header "FEATURES" .SS ":=" .IX Subsection ":=" Because the whitespace between an attribute list and assignment operator is not significant, it was possible to specify assignment to a variable with an empty attribute list with a construction like \f(CW\*(C`my $foo := \*(Aqbar\*(Aq\*(C'\fR. This is deprecated in perl v5.12.0 to allow the possibility of a future \f(CW\*(C`:=\*(C'\fR operator. Avoid the issue by either putting whitespace between the \f(CW\*(C`:\*(C'\fR and \f(CW\*(C`=\*(C'\fR characters or simply omitting the empty attribute list. .SS "$[" .IX Subsection "$[" The magic \*(L"$[\*(R" in perlvar variable was used in very old perls to determine the index of the first element of arrays or the first character in substrings, and also allow modifying this value. It was discouraged from the start of Perl 5, its functionality changed in v5.10.0, deprecated in v5.12.0, re-implemented as arybase.pm in v5.16.0, and it is essentially a synonym for \f(CW0\fR under \&\f(CW\*(C`use v5.16\*(C'\fR or \f(CW\*(C`no feature "array_base"\*(C'\fR. While it is probably a bad idea in general, the modules Array::Base and String::Base can now be used to replace this functionality. .SS "/\eC/" .IX Subsection "/C/" The \f(CW\*(C`\eC\*(C'\fR regular expression character class would match a single byte of the internal representation of the string, which was dangerous because it violated the logical character abstraction of Perl strings, and substitutions using it could result in malformed \s-1UTF\-8\s0 sequences. It was deprecated in perl v5.20.0 and removed in perl v5.24.0. Instead, explicitly encode the string to \s-1UTF\-8\s0 using Encode to examine its UTF\-8\-encoded byte representation. .SS "?PATTERN?" .IX Subsection "?PATTERN?" The \f(CW\*(C`?PATTERN?\*(C'\fR regex match syntax is deprecated in perl v5.14.0 and removed in perl v5.22.0. Use \f(CW\*(C`m?PATTERN?\*(C'\fR instead. .SS "autoderef" .IX Subsection "autoderef" An experimental feature was introduced in perl v5.14.0 to allow calling various builtin functions (which operate on arrays or hashes) on a reference, which would automatically dereference the operand. This led to ambiguity when passed objects that overload both array and hash dereferencing, and so was removed in perl v5.24.0. Instead, explicitly dereference the reference when calling these functions. The functions affected are \f(CW\*(C`each\*(C'\fR, \f(CW\*(C`keys\*(C'\fR, \f(CW\*(C`pop\*(C'\fR, \f(CW\*(C`push\*(C'\fR, \&\f(CW\*(C`shift\*(C'\fR, \f(CW\*(C`splice\*(C'\fR, \f(CW\*(C`unshift\*(C'\fR, and \f(CW\*(C`values\*(C'\fR. .SS "Bare here-doc" .IX Subsection "Bare here-doc" Using \f(CW\*(C` << \*(C'\fR to initiate a here-doc would create it with an empty terminator, similar to \f(CW\*(C` <<\*(Aq\*(Aq \*(C'\fR, so the here-doc would terminate on the next empty line. Omitting the quoted empty string has been deprecated since perl 5, and is a fatal error in perl v5.28.0. .SS "chdir('')" .IX Subsection "chdir('')" Passing an empty string or \f(CW\*(C`undef\*(C'\fR to \f(CW\*(C`chdir()\*(C'\fR would change to the home directory, but this usage is deprecated in perl v5.8.0 and throws an error in perl v5.24.0. Instead, call \f(CW\*(C`chdir()\*(C'\fR with no arguments for this behavior. .SS "defined on array/hash" .IX Subsection "defined on array/hash" Using the function \f(CW\*(C`defined()\*(C'\fR on an array or hash probably does not do what you expected, and is deprecated in perl v5.6.2 and throws a fatal error in perl v5.22.0. To check if an array or hash is non-empty, test if it has elements. .PP .Vb 2 \& if (@foo) { ... } \& if (keys %bar) { ... } .Ve .SS "do \s-1SUBROUTINE\s0(\s-1LIST\s0)" .IX Subsection "do SUBROUTINE(LIST)" This form of \f(CW\*(C`do\*(C'\fR to call a subroutine has been deprecated since perl 5, and is removed in perl v5.20.0. .SS "\s-1NBSP\s0 in \eN{...}" .IX Subsection "NBSP in N{...}" Use of the \*(L"no-break space\*(R" character in character names is deprecated in perl v5.22.0 and an error in perl v5.26.0. .SS "\s-1POSIX\s0 character functions" .IX Subsection "POSIX character functions" Several character matching functions in \s-1POSIX\s0.pm are deprecated in perl v5.20.0. See the \s-1POSIX\s0 documentation for more details. Most uses of these functions can be replaced with appropriate regex matches. .PP .Vb 1 \& isalnum, isalpha, iscntrl, isdigit, isgraph, islower, isprint, ispunct, isspace, issuper, isxdigit .Ve .SS "\fBPOSIX::tmpnam()\fP" .IX Subsection "POSIX::tmpnam()" The \f(CW\*(C`tmpnam()\*(C'\fR function from \s-1POSIX\s0.pm is deprecated in perl v5.22.0 and removed in perl v5.26.0. Use File::Temp instead. .SS "qw(...) as parentheses" .IX Subsection "qw(...) as parentheses" Literal parentheses are required for certain statements such as a \&\f(CW\*(C`for my $foo (...) { ... }\*(C'\fR construct. Using a \f(CW\*(C`qw(...)\*(C'\fR list literal without surrounding parentheses in this syntax is deprecated in perl v5.14.0 and a syntax error in perl v5.18.0. Wrap the literal in parentheses: \&\f(CW\*(C`for my $foo (qw(...)) { ... }\*(C'\fR. .SS "require ::Foo::Bar" .IX Subsection "require ::Foo::Bar" A bareword \f(CW\*(C`require\*(C'\fR (or \f(CW\*(C`use\*(C'\fR) starting with a double colon would inadvertently translate to a path starting with \f(CW\*(C`/\*(C'\fR. Starting in perl v5.26.0, this is a fatal error. .SS "\s-1UNIVERSAL\-\s0>\fBimport()\fP" .IX Subsection "UNIVERSAL->import()" The method \f(CW\*(C`UNIVERSAL\->import()\*(C'\fR and similarly passing import arguments to \&\f(CW\*(C`use UNIVERSAL\*(C'\fR is deprecated in perl v5.12.0 and throws a fatal error in perl v5.22.0. Calling \f(CW\*(C`use UNIVERSAL\*(C'\fR with no arguments is not an error, but serves no purpose. .SH "AFFILIATION" .IX Header "AFFILIATION" This policy is part of Perl::Critic::Freenode. .SH "CONFIGURATION" .IX Header "CONFIGURATION" This policy is not configurable except for the standard options. .SH "CAVEATS" .IX Header "CAVEATS" This policy is incomplete, as many deprecations are difficult to test for statically. It is recommended to use perlbrew or perl-build to test your code under newer versions of Perl, with \f(CW\*(C`warnings\*(C'\fR enabled. .SH "AUTHOR" .IX Header "AUTHOR" Dan Book, \f(CW\*(C`dbook@cpan.org\*(C'\fR .SH "COPYRIGHT AND LICENSE" .IX Header "COPYRIGHT AND LICENSE" Copyright 2015, Dan Book. .PP This library is free software; you may redistribute it and/or modify it under the terms of the Artistic License version 2.0. .SH "SEE ALSO" .IX Header "SEE ALSO" Perl::Critic