我正在尝试使用Perl::Tidy模块来尽可能地缩小Perl代码。当然,我不在乎格式化,所以我为模块手动设置argv。我无法解决的一个问题是"="符号和箭头"=>"两侧的空间将其调整为垂直选项卡。如果我使用开关"-naws",它会删除所有空格和关键字,并粘贴到变量等。
下面是一个带有Perl整洁选项的示例测试脚本,用于快速查看。
use Perl::Tidy;
my $source_string = <<'EOT';
# this is comment remove it
=another pod
also remove this pod line
=cut
my $error = Perl::Tidy::perltidy(
argv => $argv,
source => $source_string,
destination => $dest_string,
stderr => $stderr_string,
errorfile => $errorfile_string,
);
sub {
my (@arg) = @_;
print @arg;
foreach my $var (@items) {
print "my name is $item" or die "error here";
}
return;
if ($names) {
say "ok";
} else {
print "nice";
}
$name = $x + 123 + $year . $month;
our @EXPORT = (
Moose => [],
utf8 => [],
#true => [],
);
}
EOT
my $dest_string;
my $stderr_string;
my $errorfile_string;
my $argv = "-npro"; # Ignore any .perltidyrc at this site
$argv .= " -pbp"; # Format according to perl best practices
$argv .= " -nst"; # Must turn off -st in case -pbp is specified
$argv .= " -se"; # -se appends the errorfile to stderr
$argv .= " -ci=0 -cti=0 -dac -sil=0"; #
$argv
= "-vt=2 -nolq -i=0 -sil=0 -ce -l=1024 -nbl -pt=2 -bt=2 -sbt=2 -bbt=2 -bvt=2 -sbvt=1 -pvtc=1 -cti=0 -ci=0 -nsfs -nsts -bar -dac -dbc -dsc -dp -sob -ce -mbl=0 -dws -ple ";
#$argv .= " -wbb='% + - * / x != == >= <= =~ !~ < > | & = **= += *= &= <<= &&= -= /= |= >>= ||= //= .= %= ^= x=' "; # want break before tokens in string
#$argv .= " -nsak='my our local' -naws ";
$argv .= " -aws -nsfs -nolq"; # default -aws is on, off = -naws
my $error = Perl::Tidy::perltidy(
argv => $argv,
source => $source_string,
destination => $dest_string,
stderr => $stderr_string,
errorfile => $errorfile_string, # ignored when -se flag is set
);
if ($error) {
# serious error in input parameters, no tidied output
die "Exiting because of serious errors -dac -sil=0n";
}
if ($dest_string) { print "n$dest_stringn" }
#if ($stderr_string) { print "<<STDERR>>n$stderr_stringn" }
#if ($errorfile_string) { print "<<.ERR file>>n$errorfile_stringn" }
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=Tidy Options
http://perltidy.sourceforge.net/perltidy.html
These are Perl::Tidy module options that can be passed in the $argv variable
to the ProcessPerlFile sub routine.
Negates:
A prefix of "n" negates short form toggle switches, and a prefix of "no"
negates the long forms. For example, -nasc means don't add missing
semicolons.
Basic Options
-i=n use n columns per indentation level (default n=4)
-t tabs: use one tab character per indentation level, not recommeded
-nt no tabs: use n spaces per indentation level (default)
-et=n entab leading whitespace n spaces per tab; not recommended
-io "indent only": just do indentation, no other formatting.
-sil=n set starting indentation level to n; use if auto detection fails
-ole=s specify output line ending (s=dos or win, mac, unix)
-ple keep output line endings same as input (input must be filename)
Whitespace Control
-fws freeze whitespace; this disables all whitespace changes
and disables the following switches:
-bt=n sets brace tightness, n= (0 = loose, 1=default, 2 = tight)
-bbt same as -bt but for code block braces; same as -bt if not given
-bbvt block braces vertically tight; use with -bl or -bli
-bbvtl=s make -bbvt to apply to selected list of block types
-pt=n paren tightness (n=0, 1 or 2)
-sbt=n square bracket tightness (n=0, 1, or 2)
-bvt=n brace vertical tightness,
n=(0=open, 1=close unless multiple steps on a line, 2=always close)
-pvt=n paren vertical tightness (see -bvt for n)
-sbvt=n square bracket vertical tightness (see -bvt for n)
-bvtc=n closing brace vertical tightness:
n=(0=open, 1=sometimes close, 2=always close)
-pvtc=n closing paren vertical tightness, see -bvtc for n.
-sbvtc=n closing square bracket vertical tightness, see -bvtc for n.
-ci=n sets continuation indentation=n, default is n=2 spaces
-lp line up parentheses, brackets, and non-BLOCK braces
-sfs add space before semicolon in for( ; ; )
-aws allow perltidy to add whitespace (default)
-dws delete all old non-essential whitespace
-icb indent closing brace of a code block
-cti=n closing indentation of paren, square bracket, or non-block brace:
n=0 none, =1 align with opening, =2 one full indentation level
-icp equivalent to -cti=2
-wls=s want space left of tokens in string; i.e. -nwls='+ - * /'
-wrs=s want space right of tokens in string;
-sts put space before terminal semicolon of a statement
-sak=s put space between keywords given in s and '(';
-nsak=s no space between keywords in s and '('; i.e. -nsak='my our local'
Line Break Control
-fnl freeze newlines; this disables all line break changes
and disables the following switches:
-anl add newlines; ok to introduce new line breaks
-bbs add blank line before subs and packages
-bbc add blank line before block comments
-bbb add blank line between major blocks
-sob swallow optional blank lines
-ce cuddled else; use this style: '} else {'
-dnl delete old newlines (default)
-mbl=n maximum consecutive blank lines (default=1)
-l=n maximum line length; default n=80
-bl opening brace on new line
-sbl opening sub brace on new line. value of -bl is used if not given.
-bli opening brace on new line and indented
-bar opening brace always on right, even for long clauses
-vt=n vertical tightness (requires -lp); n controls break after opening
token: 0=never 1=no break if next line balanced 2=no break
-vtc=n vertical tightness of closing container; n controls if closing
token starts new line: 0=always 1=not unless list 1=never
-wba=s want break after tokens in string; i.e. wba=': .'
-wbb=s want break before tokens in string
Following Old Breakpoints
-boc break at old comma breaks: turns off all automatic list formatting
-bol break at old logical breakpoints: or, and, ||, && (default)
-bok break at old list keyword breakpoints such as map, sort (default)
-bot break at old conditional (trinary ?:) operator breakpoints (default)
-cab=n break at commas after a comma-arrow (=>):
n=0 break at all commas after =>
n=1 stable: break unless this breaks an existing one-line container
n=2 break only if a one-line container cannot be formed
n=3 do not treat commas after => specially at all
Comment controls
-ibc indent block comments (default)
-isbc indent spaced block comments; may indent unless no leading space
-msc=n minimum desired spaces to side comment, default 4
-csc add or update closing side comments after closing BLOCK brace
-dcsc delete closing side comments created by a -csc command
-cscp=s change closing side comment prefix to be other than '## end'
-cscl=s change closing side comment to apply to selected list of blocks
-csci=n minimum number of lines needed to apply a -csc tag, default n=6
-csct=n maximum number of columns of appended text, default n=20
-cscw causes warning if old side comment is overwritten with -csc
-sbc use 'static block comments' identified by leading '##' (default)
-sbcp=s change static block comment identifier to be other than '##'
-osbc outdent static block comments
-ssc use 'static side comments' identified by leading '##' (default)
-sscp=s change static side comment identifier to be other than '##'
Delete selected text
-dac delete all comments AND pod
-dbc delete block comments
-dsc delete side comments
-dp delete pod
Send selected text to a '.TEE' file
-tac tee all comments AND pod
-tbc tee block comments
-tsc tee side comments
-tp tee pod
Outdenting
-olq outdent long quoted strings (default)
-olc outdent a long block comment line
-ola outdent statement labels
-okw outdent control keywords (redo, next, last, goto, return)
-okwl=s specify alternative keywords for -okw command
Other controls
-mft=n maximum fields per table; default n=40
-x do not format lines before hash-bang line (i.e., for VMS)
-asc allows perltidy to add a ';' when missing (default)
-dsm allows perltidy to delete an unnecessary ';' (default)
Combinations of other parameters
-gnu attempt to follow GNU Coding Standards as applied to perl
-mangle remove as many newlines as possible (but keep comments and pods)
-extrude insert as many newlines as possible
Dump and die, debugging
-dop dump options used in this run to standard output and quit
-ddf dump default options to standard output and quit
-dsn dump all option short names to standard output and quit
-dln dump option long names to standard output and quit
-dpro dump whatever configuRatio file is in effect to standard output
-dtt dump all token types to standard output and quit
HTML
-html write an html file (see 'man perl2web' for many options)
Note: when -html is used, no indentation or formatting are done.
Hint: try perltidy -html -css=mystyle.css filename.pl
and edit mystyle.css to change the appearance of filename.html.
-nnn gives line numbers
-pre only writes out <pre>..</pre> code section
-toc places a table of contents to subs at the top (default)
-pod passes pod text through pod2html (default)
-frm write html as a frame (3 files)
-text=s extra extension for table of contents if -frm, default='toc'
-sext=s extra extension for file content if -frm, default='src'
Perltidy home page at http://perltidy.sourceforge.net
=cut
#~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
下面是缩小后的代码。
my $error = Perl::Tidy::perltidy(
argv => $argv,
source => $source_string,
destination => $dest_string,
stderr => $stderr_string,
errorfile => $errorfile_string,);
sub {
my (@arg) = @_;
print @arg;
foreach my $var (@items) {
print "my name is $item" or die "error here";
}
return;
if ($names) {
say "ok";
} else {
print "nice";
}
$name = $x + 123 + $year . $month;
our @EXPORT = (
Moose => [],
utf8 => [],);
}
所以我仍然想删除类似以下行的空格:
my $error = Perl::Tidy::perltidy(
argv => $argv,
# ... );
sub {
my (@arg) = @_;
成为:
my $error=Perl::Tidy::perltidy(
argv=>$argv,
# ... );
sub{
my(@arg)=@_;
要删除=
和=>
周围的空格,需要使用-nwls
/--nowant-left-space
和--nwrs
/--nowant-right-space
选项:
-nwls="= =>" -nwrs="= =>"