﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>IT博客-金鳞-文章分类-perl-Getopt::Long</title><link>http://www.cnitblog.com/chenxin9821/category/7903.html</link><description>目标-&gt;软件测试架构师</description><language>zh-cn</language><lastBuildDate>Mon, 26 Sep 2011 19:05:22 GMT</lastBuildDate><pubDate>Mon, 26 Sep 2011 19:05:22 GMT</pubDate><ttl>60</ttl><item><title>Getopt::Long 模块zz [转] </title><link>http://www.cnitblog.com/chenxin9821/articles/52538.html</link><dc:creator>金鳞</dc:creator><author>金鳞</author><pubDate>Thu, 11 Dec 2008 07:00:00 GMT</pubDate><guid>http://www.cnitblog.com/chenxin9821/articles/52538.html</guid><wfw:comment>http://www.cnitblog.com/chenxin9821/comments/52538.html</wfw:comment><comments>http://www.cnitblog.com/chenxin9821/articles/52538.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnitblog.com/chenxin9821/comments/commentRss/52538.html</wfw:commentRss><trackback:ping>http://www.cnitblog.com/chenxin9821/services/trackbacks/52538.html</trackback:ping><description><![CDATA[<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><font face=Verdana>处理命令行选项是一个很重复的事情，Getopt::Long 把这个过程简单化了。使用这个模块其实只要知道一些常用的用法就行了。 </font></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><font face=Verdana>这是文档中的例子： </font></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><font face=Verdana>use Getopt::Long;<br>my $data&nbsp;&nbsp; = "file.dat";<br>my $length = 24;<br>my $verbose;<br>$result = GetOptions ("length=i" =&gt; \$length,&nbsp;&nbsp;&nbsp; # numeric<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "file=s"&nbsp;&nbsp; =&gt; \$data,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; # string<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; "verbose"&nbsp; =&gt; \$verbose);&nbsp; # flag</font></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><font face=Verdana>观察一下 GetOptions 函数的参数，可以发现，大致可以把设置分为三个部分： （1）命令行的选项，对应于&#8220;length&#8221;，&#8220;file&#8221;，&#8221;verbose&#8221;，这样在命令行就可以用 -length 或者 —length 甚至 -l（必须是唯一的） 触发选项了。可以通过使用&#8220;|&#8221;来设置别名。（2）选项类型，后面接有=的字符串要求接字符串（s）、 整数（i），或者浮点（f）等类型的自变量。后面接有:的选项会接受缺省为0或者为空字符串的可选自变量。（3）选项设置的变量。 </font></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><font face=Verdana>对于不传递参数的选项，也就是一些开关类型，可以在第一部分后接&#8220;!&#8221;，这表示该选项不接收自变量，但是可以通过在前面加上no变成负的（例如，&#8220;more&#8221;选项的-nomore）。如果不是用&#8220;!&#8221;，而是&#8220;+&#8221;，这表示它会在每次出现的时候增加一个变量。如果选项出现在命令行里，那么相关的变量被设置为1；如果负的选项出现了，那么相关的变量就被设置为0。 </font></p>
<p style="FONT-SIZE: 10pt; FONT-FAMILY: Courier"><font face=Verdana>下面的例子来自 http://www.zdnet.com.cn/developer/code/story/0,3800066897,39190451,00.htm</font></p>
<font face=Verdana>
<p style="FONT-SIZE: 10pt">下面的例子显示了Getopt::Long的基本用法。（要获得完整的描述，见该模块的文档。）</p>
<p style="FONT-SIZE: 10pt"><font color=#0066ff>use Getopt::Long;<br><br># declare default values for variables<br>$verbose = 0;<br>$all = 0;<br>$more = -1;&nbsp;&nbsp;&nbsp;&nbsp;# so we can detect both -more and -nomore<br>$diam = 3.1415;<br>@libs = ();<br>%flags = ();<br>$debug = -1;&nbsp;&nbsp;&nbsp;# test for -debug with no argument (0)<br><br># process options from command line<br># verbose will be incremented each time it appears<br># either all, everything or universe will set $all to 1<br># more can be negated (-nomore)<br># diameter expects a floating point argument<br># lib expects a string and can be repeated (pushing onto @libs)<br># flag expects a key=value pair and can be repeated<br># debug will optionally accept an integer (or 0 by default)<br>GetOptions('verbose+' =&gt; $verbose,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'all|everything|universe' =&gt; $all,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'more!' =&gt; $more,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'diameter=f' =&gt; $diam,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'lib=s' =&gt; @libs,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'flag=s' =&gt; %flags,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;'debug:i' =&gt; $debug);<br><br># display resulting values of variables<br>print &lt;&lt;EOS;<br>Verbose:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$verbose<br>All:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$all<br>More:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$more<br>Diameter:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$diam<br>Debug:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$debug<br>Libs:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@{[ join ', ', @libs ]}<br>Flags:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@{[ join " ", map { "$_ = $flags" } keys<br>&nbsp;%flags ]}<br><br>Remaining:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@{[ join ', ', @ARGV ]}<br>&nbsp;&nbsp;(ARGV contents)<br>EOS </font></p>
<p style="FONT-SIZE: 10pt">基本的句法是传递一个选项分类符的散列。每个选项分类符都包含有用来匹配的文本，以及用来设置的对变量的参照。这个文本可以包括一个可选的<em>or</em>（垂直通道）别名分隔列表。</p>
<p style="FONT-SIZE: 10pt">后面接有+的选项不接收自变量；但是，它会在每次出现的时候增加一个变量。后面接有!的选项不接收自变量；但是，它可以通过在前面加上<em>no</em>变成负的（例如，&#8220;more&#8221;选项的<em>-nomore</em>）。如果选项出现在命令行里，那么相关的变量被设置为1；如果负的选项出现了，那么相关的变量就被设置为0。</p>
<p style="FONT-SIZE: 10pt">后面接有=的字符串要求接字符串（s）、整数（i），或者浮点（f）等类型的自变量。后面接有:的选项会接受缺省为0或者为空字符串的可选自变量。</p>
<p style="FONT-SIZE: 10pt">如果相关联的变量是一个数组，那么选项可以多次出现，而值可以被推到数组里。如果变量是一个散列，那么就要求一个键=值（key=value）对，并被插入到散列里。</p>
<p style="FONT-SIZE: 10pt">在匹配选项名的时候，GetOptions在缺省设置下会忽略大小写，并允许选项被简写为唯一的最短字符串（例如，-m代表-more，但是-di和-de被要求只能分别代表直径和调试）。</p>
<p style="FONT-SIZE: 10pt">下面是一个命令行和输出结果的例子：</p>
<p style="FONT-SIZE: 10pt"><font color=#0066ff>perl getoptlong.pl -l=abc -l def -f a=b -f b=c -ev -de 5 -nomore arg<br><br>Verbose:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>All:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1<br>More:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;0<br>Diameter:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;3.1415<br>Debug:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;5<br>Libs:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;abc, def<br>Flags:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a = b<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;b = c<br><br>Remaining:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;arg<br>&nbsp;&nbsp;(ARGV contents) </font></p>
<p style="FONT-SIZE: 10pt">Perl为处理命令行自变量提供了丰富的工具。而Getopt::Long的出现使得利用最少的设置就可以处理复杂的选项。</font><font face=Verdana><br><br>转自：星星的天空<br><a href="http://www.cnblogs.com/starspace/archive/2008/11/07/1329020.html">http://www.cnblogs.com/starspace/archive/2008/11/07/1329020.html</a><br></font></p>
<img src ="http://www.cnitblog.com/chenxin9821/aggbug/52538.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cnitblog.com/chenxin9821/" target="_blank">金鳞</a> 2008-12-11 15:00 <a href="http://www.cnitblog.com/chenxin9821/articles/52538.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>