.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.28) .\" .\" 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 turned on, 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 "Padre::Document::Perl::Beginner 3pm" .TH Padre::Document::Perl::Beginner 3pm "2014-09-11" "perl v5.20.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" Padre::Document::Perl::Beginner \- naive implementation of some beginner specific error checking .SH "SYNOPSIS" .IX Header "SYNOPSIS" .Vb 5 \& use Padre::Document::Perl::Beginner; \& my $beginner = Padre::Document::Perl::Beginner\->new; \& if (not $beginner\->check($data)) { \& warn $beginner\->error; \& } .Ve .SH "DESCRIPTION" .IX Header "DESCRIPTION" This is a naive implementation. It needs to be replaced by one using \s-1PPI\s0. .PP In Perl 5 there are lots of pitfalls the unaware, especially the beginner can easily fall in. While some might expect the Perl compiler itself would catch those it does not (yet ?) do it. So we took the initiative and added a beginners mode to Padre in which these extra issues are checked. Some are real problems that would trigger an error anyway we just make them a special case with a more specific error message. (e.g. \f(CW\*(C`use warning;\*(C'\fR without the trailing s) Others are valid code that can be useful in the hands of a master but that are poisonous when written by mistake by someone who does not understand them. (e.g. \f(CW\*(C`if ($x = /value/) { }\*(C'\fR ). .PP This module provides a method called \f(CW\*(C`check\*(C'\fR that can check a Perl script (provided as parameter as a single string) and recognize problematic code. .SH "Examples" .IX Header "Examples" See and .SH "Cases" .IX Header "Cases" .IP "\(bu" 4 .Sp .Vb 1 \& split /,/, @data; .Ve .Sp Here \f(CW@data\fR is in scalar context returning the number of elements. Spotted in this form: .Sp .Vb 1 \& split /,/, @ARGV; .Ve .IP "\(bu" 4 .Sp .Vb 1 \& use warning; .Ve .Sp s is missing at the end. .IP "\(bu" 4 .Sp .Vb 1 \& map { $_; } (@items),$extra_item; .Ve .Sp is the same as .Sp .Vb 1 \& map { $_; } (@items,$extra_item); .Ve .Sp but you usually want .Sp .Vb 1 \& (map { $_; } (@items)),$extra_item; .Ve .Sp which means: map all \f(CW@items\fR and them add \f(CW$extra_item\fR without mapping it. .IP "\(bu" 4 Warn about Perl-standard package names being reused .Sp .Vb 1 \& package DB; .Ve .IP "\(bu" 4 .Sp .Vb 2 \& $x = chomp $y; \& print chomp $y; .Ve .IP "\(bu" 4 .Sp .Vb 1 \& map { s/foo/bar/; } (@items); .Ve .Sp This returns an array containing true or false values (s/// \- return value). .Sp Use .Sp .Vb 1 \& map { s/foo/bar/; $_; } (@items); .Ve .Sp to actually change the array via s///. .IP "\(bu" 4 .Sp .Vb 1 \& <@X> .Ve .IP "\(bu" 4 .Sp .Vb 2 \& if ($x = /bla/) { \& } .Ve .IP "\(bu" 4 Pipe | in \fIopen()\fR not at the end or the beginning. .IP "\(bu" 4 .Sp .Vb 1 \& open($ph, "| something |"); .Ve .IP "\(bu" 4 Regular expression starting with a quantifier such as .Sp .Vb 1 \& /+.../ .Ve .IP "\(bu" 4 .Sp .Vb 1 \& } else if { .Ve .IP "\(bu" 4 .Sp .Vb 1 \& } elseif { .Ve .IP "\(bu" 4 .Sp .Vb 1 \& close; .Ve .SH "HOW TO ADD ANOTHER ONE" .IX Header "HOW TO ADD ANOTHER ONE" Please feel free to add as many checks as you like. This is done in three steps: .SS "Add the test" .IX Subsection "Add the test" Add one (or more) tests for this case to \fIt/75\-perl\-beginner.t\fR .PP The test should be successful when your supplied sample fails the check and returns the correct error message. As texts of error messages may change, try to match a good part which allows identification of the message but don't match the very exact text. .PP Tests could use either one-liners written as strings within the test file or external support files. There are samples for both ways in the test script. .SS "Add the check" .IX Subsection "Add the check" Add the check to the check-sub of this file (\fIDocument/Perl/Beginner.pm\fR). There are plenty samples here. Remember to add a sample (and maybe short description) what would fail the test. .PP Run the test script to match your test case(s) to the new check. .SS "Add the configuration option" .IX Subsection "Add the configuration option" Go to \fIConfig.pm\fR, look for the beginner error checks configuration and add a new setting for your new check there. It defaults to 1 (run the check), but a user could turn it off by setting this to 0 within the Padre configuration file. .SH "COPYRIGHT & LICENSE" .IX Header "COPYRIGHT & LICENSE" Copyright 2008\-2013 The Padre development team as listed in Padre.pm. .PP This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. .PP The full text of the license can be found in the \&\s-1LICENSE\s0 file included with this module.