[Moscow.pm] Так сколько же статей в Perl Best Practices?

Иван Бессарабов ivan на bessarabov.ru
Вт Янв 17 20:49:05 PST 2012

На странице http://oreilly.com/perl/excerpts/perl-best-practices/appendix-b.html
сказано что в Perl Best Practices 256 статей: "This appendix lists the
complete set of 256 guidelines presented in this book.". На этой же
странице приведен список. Я их пересчитал и у меня получилось 255.
Какую статью я пропустил?

Chapter 2, [Code Layout]
     *   1 Brace and parenthesize in K&R style. [Bracketing]
     *   2 Separate your control keywords from the following opening
bracket. [Keywords]
     *   3 Don't separate subroutine or variable names from the
following opening bracket. [Subroutines and Variables]
     *   4 Don't use unnecessary parentheses for builtins and
"honorary" builtins. [Builtins]
     *   5 Separate complex keys or indices from their surrounding
brackets. [Keys and Indices]
     *   6 Use whitespace to help binary operators stand out from
their operands. [Operators]
     *   7 Place a semicolon after every statement. [Semicolons]
     *   8 Place a comma after every value in a multiline list. [Commas]
     *   9 Use 78-column lines. [Line Lengths]
     *  10 Use four-column indentation levels. [Indentation]
     *  11 Indent with spaces, not tabs. [Tabs]
     *  12 Never place two statements on the same line. [Blocks]
     *  13 Code in paragraphs. [Chunking]
     *  14 Don't cuddle an else. [Elses]
     *  15 Align corresponding items vertically. [Vertical Alignment]
     *  16 Break long expressions before an operator. [Breaking Long Lines]
     *  17 Factor out long expressions in the middle of statements.
[Non-Terminal Expressions]
     *  18 Always break a long expression at the operator of the
lowest possible precedence. [Breaking by Precedence]
     *  19 Break long assignments before the assignment operator. [Assignments]
     *  20 Format cascaded ternary operators in columns. [Ternaries]
     *  21 Parenthesize long lists. [Lists]
     *  22 Enforce your chosen layout style mechanically. [Automated Layout]
Chapter 3, [Naming Conventions]
     *  23 Use grammatical templates when forming identifiers. [Identifiers]
     *  24 Name booleans after their associated test. [Booleans]
     *  25 Mark variables that store references with a _ref suffix.
[Reference Variables]
     *  26 Name arrays in the plural and hashes in the singular.
[Arrays and Hashes]
     *  27 Use underscores to separate words in multiword identifiers.
     *  28 Distinguish different program components by case. [Capitalization]
     *  29 Abbr idents by prefx. [Abbreviations]
     *  30 Abbreviate only when the meaning remains unambiguous.
[Ambiguous Abbreviations]
     *  31 Avoid using inherently ambiguous words in names. [Ambiguous Names]
     *  32 Prefix "for internal use only" subroutines with an
underscore. [Utility Subroutines]
Chapter 4, [Values and Expressions]
     *  33 Use interpolating string delimiters only for strings that
actually interpolate. [String Delimiters]
     *  34 Don't use "" or '' for an empty string. [Empty Strings]
     *  35 Don't write one-character strings in visually ambiguous
ways. [Single-Character Strings]
     *  36 Use named character escapes instead of numeric escapes.
[Escaped Characters]
     *  37 Use named constants, but don't use constant. [Constants]
     *  38 Don't pad decimal numbers with leading zeros. [Leading Zeros]
     *  39 Use underscores to improve the readability of long numbers.
[Long Numbers]
     *  40 Lay out multiline strings over multiple lines. [Multiline Strings]
     *  41 Use a heredoc when a multiline string exceeds two lines.
[Here Documents]
     *  42 Use a "theredoc" when a heredoc would compromise your
indentation. [Heredoc Indentation]
     *  43 Make every heredoc terminator a single uppercase identifier
with a standard prefix. [Heredoc Terminators]
     *  44 When introducing a heredoc, quote the terminator. [Heredoc Quoters]
     *  45 Don't use barewords. [Barewords]
     *  46 Reserve => for pairs. [Fat Commas]
     *  47 Don't use commas to sequence statements. [Thin Commas]
     *  48 Don't mix high- and low-precedence booleans.
[Low-Precedence Operators]
     *  49 Parenthesize every raw list. [Lists]
     *  50 Use table-lookup to test for membership in lists of
strings; use any() for membership of lists of anything else. [List
Chapter 5, [Variables]
     *  51 Avoid using non-lexical variables. [Lexical Variables]
     *  52 Don't use package variables in your own development.
[Package Variables]
     *  53 If you're forced to modify a package variable, localize it.
     *  54 Initialize any variable you localize. [Initialization]
     *  55 use English for the less familiar punctuation variables.
[Punctuation Variables]
     *  56 If you're forced to modify a punctuation variable, localize
it. [Localizing Punctuation Variables]
     *  57 Don't use the regex match variables. [Match Variables]
     *  58 Beware of any modification via $_. [Dollar-Underscore]
     *  59 Use negative indices when counting from the end of an
array. [Array Indices]
     *  60 Take advantage of hash and array slicing. [Slicing]
     *  61 Use a tabular layout for slices. [Slice Layout]
     *  62 Factor large key or index lists out of their slices. [Slice
Chapter 6, [Control Structures]
     *  63 Use block if, not postfix if. [If Blocks]
     *  64 Reserve postfix if for flow-of-control statements. [Postfix
     *  65 Don't use postfix unless, for, while, or until. [Other
Postfix Modifiers]
     *  66 Don't use unless or until at all. [Negative Control Statements]
     *  67 Avoid C-style for statements. [C-Style Loops]
     *  68 Avoid subscripting arrays or hashes within loops.
[Unnecessary Subscripting]
     *  69 Never subscript more than once in a loop. [Necessary Subscripting]
     *  70 Use named lexicals as explicit for loop iterators.
[Iterator Variables]
     *  71 Always declare a for loop iterator variable with my.
[Non-Lexical Loop Iterators]
     *  72 Use map instead of for when generating new lists from old.
[List Generation]
     *  73 Use grep and first instead of for when searching for values
in a list. [List Selections]
     *  74 Use for instead of map when transforming a list in place.
[List Transformation]
     *  75 Use a subroutine call to factor out complex list
transformations. [Complex Mappings]
     *  76 Never modify $_ in a list function. [List Processing Side Effects]
     *  77 Avoid cascading an if. [Multipart Selections]
     *  78 Use table look-up in preference to cascaded equality tests.
[Value Switches]
     *  79 When producing a value, use tabular ternaries. [Tabular Ternaries]
     *  80 Don't use do...while loops. [do-while Loops]
     *  81 Reject as many iterations as possible, as early as
possible. [Linear Coding]
     *  82 Don't contort loop structures just to consolidate control.
[Distributed Control]
     *  83 Use for and redo instead of an irregularly counted while. [Redoing]
     *  84 Label every loop that is exited explicitly, and use the
label with every next, last, or redo. [Loop Labels]
Chapter 7, [Documentation]
     *  85 Distinguish user documentation from technical
documentation. [Types of Documentation]
     *  86 Create standard POD templates for modules and applications.
     *  87 Extend and customize your standard POD templates. [Extended
     *  88 Put user documentation in source files. [Location]
     *  89 Keep all user documentation in a single place within your
source file. [Contiguity]
     *  90 Place POD as close as possible to the end of the file. [Position]
     *  91 Subdivide your technical documentation appropriately.
[Technical Documentation]
     *  92 Use block templates for major comments. [Comments]
     *  93 Use full-line comments to explain the algorithm.
[Algorithmic Documentation]
     *  94 Use end-of-line comments to point out subtleties and
oddities. [Elucidating Documentation]
     *  95 Comment anything that has puzzled or tricked you.
[Defensive Documentation]
     *  96 Consider whether it's better to rewrite than to comment.
[Indicative Documentation]
     *  97 Use "invisible" POD sections for longer technical
discussions. [Discursive Documentation]
     *  98 Check the spelling, syntax, and sanity of your
documentation. [Proofreading]
Chapter 8, [Built-in Functions]
     *  99 Don't recompute sort keys inside a sort. [Sorting]
     * 100 Use reverse to reverse a list. [Reversing Lists]
     * 101 Use scalar reverse to reverse a scalar. [Reversing Scalars]
     * 102 Use unpack to extract fixed-width fields. [Fixed-Width Data]
     * 103 Use split to extract simple variable-width fields. [Separated Data]
     * 104 Use Text::CSV_XS to extract complex variable-width fields.
[Variable-Width Data]
     * 105 Avoid string eval. [String Evaluations]
     * 106 Consider building your sorting routines with Sort::Maker.
[Automating Sorts]
     * 107 Use 4-arg substr instead of lvalue substr. [Substrings]
     * 108 Make appropriate use of lvalue values. [Hash Values]
     * 109 Use glob, not <...>. [Globbing]
     * 110 Avoid a raw select for non-integer sleeps. [Sleeping]
     * 111 Always use a block with a map and grep. [Mapping and Grepping]
     * 112 Use the "non-builtin builtins". [Utilities]
Chapter 9, [Subroutines]
     * 113 Call subroutines with parentheses but without a leading &.
[Call Syntax]
     * 114 Don't give subroutines the same names as built-in
functions. [Homonyms]
     * 115 Always unpack @_ first. [Argument Lists]
     * 116 Use a hash of named arguments for any subroutine that has
more than three parameters. [Named Arguments]
     * 117 Use definedness or existence to test for missing arguments.
[Missing Arguments]
     * 118 Resolve any default argument values as soon as @_ is
unpacked. [Default Argument Values]
     * 119 Always return scalar in scalar returns. [Scalar Return Values]
     * 120 Make list-returning subroutines return the "obvious" value
in scalar context. [Contextual Return Values]
     * 121 When there is no "obvious" scalar context return value,
consider Contextual::Return instead. [Multi-Contextual Return Values]
     * 122 Don't use subroutine prototypes. [Prototypes]
     * 123 Always return via an explicit return. [Implicit Returns]
     * 124 Use a bare return to return failure. [Returning Failure]
Chapter 10, [I/O]
     * 125 Don't use bareword filehandles. [Filehandles]
     * 126 Use indirect filehandles. [Indirect Filehandles]
     * 127 If you have to use a package filehandle, localize it first.
[Localizing Filehandles]
     * 128 Use either the IO::File module or the three-argument form
of open. [Opening Cleanly]
     * 129 Never open, close, or print to a file without checking the
outcome. [Error Checking]
     * 130 Close filehandles explicitly, and as soon as possible. [Cleanup]
     * 131 Use while (<>), not for (<>). [Input Loops]
     * 132 Prefer line-based I/O to slurping. [Line-Based Input]
     * 133 Slurp a filehandle with a do block for purity. [Simple Slurping]
     * 134 Slurp a stream with Perl6::Slurp for power and simplicity.
[Power Slurping]
     * 135 Avoid using *STDIN, unless you really mean it. [Standard Input]
     * 136 Always put filehandles in braces within any print
statement. [Printing to Filehandles]
     * 137 Always prompt for interactive input. [Simple Prompting]
     * 138 Don't reinvent the standard test for interactivity. [Interactivity]
     * 139 Use the IO::Prompt module for prompting. [Power Prompting]
     * 140 Always convey the progress of long non-interactive
operations within interactive applications. [Progress Indicators]
     * 141 Consider using the Smart::Comments module to automate your
progress indicators. [Automatic Progress Indicators]
     * 142 Avoid a raw select when setting autoflushes. [Autoflushing]
Chapter 11, [References]
     * 143 Wherever possible, dereference with arrows. [Dereferencing]
     * 144 Where prefix dereferencing is unavoidable, put braces
around the reference. [Braced References]
     * 145 Never use symbolic references. [Symbolic References]
     * 146 Use weaken to prevent circular data structures from leaking
memory. [Cyclic References]
Chapter 12, [Regular Expressions]
     * 147 Always use the /x flag. [Extended Formatting]
     * 148 Always use the /m flag. [Line Boundaries]
     * 149 Use \A and \z as string boundary anchors. [String Boundaries]
     * 150 Use \z, not \Z, to indicate "end of string". [End of String]
     * 151 Always use the /s flag. [Matching Anything]
     * 152 Consider mandating the Regexp::Autoflags module. [Lazy Flags]
     * 153 Use m{...} in preference to /.../ in multiline regexes.
[Brace Delimiters]
     * 154 Don't use any delimiters other than /.../ or m{...}. [Other
     * 155 Prefer singular character classes to escaped
metacharacters. [Metacharacters]
     * 156 Prefer named characters to escaped metacharacters. [Named Characters]
     * 157 Prefer properties to enumerated character classes. [Properties]
     * 158 Consider matching arbitrary whitespace, rather than
specific whitespace characters. [Whitespace]
     * 159 Be specific when matching "as much as possible".
[Unconstrained Repetitions]
     * 160 Use capturing parentheses only when you intend to capture.
[Capturing Parentheses]
     * 161 Use the numeric capture variables only when you're sure
that the preceding match succeeded. [Captured Values]
     * 162 Always give captured substrings proper names. [Capture Variables]
     * 163 Tokenize input using the /gc flag. [Piecewise Matching]
     * 164 Build regular expressions from tables. [Tabular Regexes]
     * 165 Build complex regular expressions from simpler pieces.
[Constructing Regexes]
     * 166 Consider using Regexp::Common instead of writing your own
regexes. [Canned Regexes]
     * 167 Always use character classes instead of single-character
alternations. [Alternations]
     * 168 Factor out common affixes from alternations. [Factoring Alternations]
     * 169 Prevent useless backtracking. [Backtracking]
     * 170 Prefer fixed-string eq comparisons to fixed-pattern regex
matches. [String Comparisons]
Chapter 13, [Error Handling]
     * 171 Throw exceptions instead of returning special values or
setting flags. [Exceptions]
     * 172 Make failed builtins throw exceptions too. [Builtin Failures]
     * 173 Make failures fatal in all contexts. [Contextual Failure]
     * 174 Be careful when testing for failure of the system builtin.
[Systemic Failure]
     * 175 Throw exceptions on all failures, including recoverable
ones. [Recoverable Failure]
     * 176 Have exceptions report from the caller's location, not from
the place where they were thrown. [Reporting Failure]
     * 177 Compose error messages in the recipient's dialect. [Error Messages]
     * 178 Document every error message in the recipient's dialect.
[Documenting Errors]
     * 179 Use exception objects whenever failure data needs to be
conveyed to a handler. [OO Exceptions]
     * 180 Use exception objects when error messages may change.
[Volatile Error Messages]
     * 181 Use exception objects when two or more exceptions are
related. [Exception Hierarchies]
     * 182 Catch exception objects in most-derived-first order.
[Processing Exceptions]
     * 183 Build exception classes automatically. [Exception Classes]
     * 184 Unpack the exception variable in extended exception
handlers. [Unpacking Exceptions]
Chapter 14, [Command-Line Processing]
     * 185 Enforce a single consistent command-line structure.
[Command-Line Structure]
     * 186 Adhere to a standard set of conventions in your
command-line syntax. [Command-Line Conventions]
     * 187 Standardize your meta-options. [Meta-options]
     * 188 Allow the same filename to be specified for both input and
output. [In-situ Arguments]
     * 189 Standardize on a single approach to command-line
processing. [Command-Line Processing]
     * 190 Ensure that your interface, run-time messages, and
documentation remain consistent. [Interface Consistency]
     * 191 Factor out common command-line interface components into a
shared module. [Interapplication Consistency]
Chapter 15, [Objects]
     * 192 Make object orientation a choice, not a default. [Using OO]
     * 193 Choose object orientation using appropriate criteria. [Criteria]
     * 194 Don't use pseudohashes . [Pseudohashes]
     * 195 Don't use restricted hashes. [Restricted Hashes]
     * 196 Always use fully encapsulated objects. [Encapsulation]
     * 197 Give every constructor the same standard name. [Constructors]
     * 198 Don't let a constructor clone objects. [Cloning]
     * 199 Always provide a destructor for every inside-out class. [Destructors]
     * 200 When creating methods, follow the general guidelines for
subroutines. [Methods]
     * 201 Provide separate read and write accessors. [Accessors]
     * 202 Don't use lvalue accessors. [Lvalue Accessors]
     * 203 Don't use the indirect object syntax. [Indirect Objects]
     * 204 Provide an optimal interface, rather than a minimal one.
[Class Interfaces]
     * 205 Overload only the isomorphic operators of algebraic
classes. [Operator Overloading]
     * 206 Always consider overloading the boolean, numeric, and
string coercions of objects. [Coercions]
Chapter 16, [Class Hierarchies]
     * 207 Don't manipulate the list of base classes directly. [Inheritance]
     * 208 Use distributed encapsulated objects. [Objects]
     * 209 Never use the one-argument form of bless. [Blessing Objects]
     * 210 Pass constructor arguments as labeled values, using a hash
reference. [Constructor Arguments]
     * 211 Distinguish arguments for base classes by class name as
well. [Base Class Initialization]
     * 212 Separate your construction, initialization, and destruction
processes. [Construction and Destruction]
     * 213 Build the standard class infrastructure automatically.
[Automating Class Hierarchies]
     * 214 Use Class::Std to automate the deallocation of attribute
data. [Attribute Demolition]
     * 215 Have attributes initialized and verified automatically.
[Attribute Building]
     * 216 Specify coercions as :STRINGIFY, :NUMERIFY, and :BOOLIFY
methods. [Coercions]
     * 217 Use :CUMULATIVE methods instead of SUPER:: calls.
[Cumulative Methods]
     * 218 Don't use AUTOLOAD(). [Autoloading]
Chapter 17, [Modules]
     * 219 Design the module's interface first. [Interfaces]
     * 220 Place original code inline. Place duplicated code in a
subroutine. Place duplicated subroutines in a module. [Refactoring]
     * 221 Use three-part version numbers. [Version Numbers]
     * 222 Enforce your version requirements programmatically.
[Version Requirements]
     * 223 Export judiciously and, where possible, only by request. [Exporting]
     * 224 Consider exporting declaratively. [Declarative Exporting]
     * 225 Never make variables part of a module's interface.
[Interface Variables]
     * 226 Build new module frameworks automatically. [Creating Modules]
     * 227 Use core modules wherever possible. [The Standard Library]
     * 228 Use CPAN modules where feasible. [CPAN]
Chapter 18, [Testing and Debugging]
     * 229 Write the test cases first. [Test Cases]
     * 230 Standardize your tests with Test::Simple or Test::More.
[Modular Testing]
     * 231 Standardize your test suites with Test::Harness. [Test Suites]
     * 232 Write test cases that fail. [Failure]
     * 233 Test both the likely and the unlikely. [What to Test]
     * 234 Add new test cases before you start debugging. [Debugging
and Testing]
     * 235 Always use strict. [Strictures]
     * 236 Always turn on warnings explicitly. [Warnings]
     * 237 Never assume that a warning-free compilation implies
correctness. [Correctness]
     * 238 Turn off strictures or warnings explicitly, selectively,
and in the smallest possible scope. [Overriding Strictures]
     * 239 Learn at least a subset of the perl debugger. [The Debugger]
     * 240 Use serialized warnings when debugging "manually". [Manual Debugging]
     * 241 Consider using "smart comments" when debugging, rather than
warn statements. [Semi-Automatic Debugging]
Chapter 19, [Miscellanea]
     * 242 Use a revision control system. [Revision Control]
     * 243 Integrate non-Perl code into your applications via the
Inline:: modules. [Other Languages]
     * 244 Keep your configuration language uncomplicated. [Configuration Files]
     * 245 Don't use formats. [Formats]
     * 246 Don't tie variables or filehandles. [Ties]
     * 247 Don't be clever. [Cleverness]
     * 248 If you must rely on cleverness, encapsulate it.
[Encapsulated Cleverness]
     * 249 Don't optimize code—benchmark it. [Benchmarking]
     * 250 Don't optimize data structures—measure them. [Memory]
     * 251 Look for opportunities to use caches. [Caching]
     * 252 Automate your subroutine caching. [Memoization]
     * 253 Benchmark any caching strategy you use. [Caching for Optimization]
     * 254 Don't optimize applications—profile them. [Profiling]
     * 255 Be careful to preserve semantics when refactoring syntax. [Enbugging]

Подробная информация о списке рассылки Moscow-pm