返回列表 回复 发帖

关于使用Perl map函数和命令行解析的技巧

Perl的map函数在你需要简化可能重复进行的操作,比方将文本串变为大写之类的工作的时候会让你得心应手
。在本文中,我们将提供几个例子教你如何使用map函数。然后,我们将把注意力转向Perl的文本解析功能并看看你在从程序的命令行提取参数或者其它信息的时候可以使用的几种方法。

map的力量

Perl提供了许多有用的函数来帮助简化或者缩短代码。
在这其中有一个非常强大,它就是map函数,它使用一个列表,并对每个元素以一个指定的代码块或者表达式进行求值运算,然后返回所有结果的一个列表。在代码块中,map使用局部的符号$_作为当前列表元素的别称。

对map 的最简单的使用是将整个数组大写化,这个过程是通过uc功能在每个元素上作用一次实现的:
@caps = map uc, @phrases;

在下一个例子中,将一个语法规则表达式映射到字符串数组返回每个短语的首字:
@first_word = map { /(\S+)/ } @phrases;

每个元素不一定必须映射到唯一一个对象上去。如果生成了多个值,map象生成单个值的时候那样作为平面的列表返回它们。例如,你可以将所有短语中的单词分割到一个列表中去:
@words = map split, @phrases;

map还有一种用法,可以用来把一串文本变成标题。你可以将一个字符串分割成独立的单词,然后将单词的每个字母改成小写,再将首字母大写,最后将这些字母合并成一个字符串:
$title = join ' ', map { ucfirst lc } split / /, $name;

我们最后的一个例子使用map来把一个散列函数经过排序后的键/值对放到一个两栏的HTML表里面去:
print "\n";
print map {" $_ $hash{$_}
\n"} sort keys %hash;
print " \n";


命令行解析

当你需要知道用户向你的Perl程序传递了什么样的开关参数的时候你可以用不同的方法来实现。一个简单的检查是否存在Boolean参数的方法是循环检测@ARGV数组,为遇到的每一个参数设置一个标志:
foreach $arg (@ARGV) {
$a = 1, next if $arg eq '-a';
$b = 1, next if $arg eq '-b';
$c = 1, next if $arg eq '-c';
}

另一个简单的办法是使用Perl的-s参数。在这种情况下,Perl会生成与开关参数同名的变量并从@ARGV数组里删除它们。例如:
perl -s prog.pm -a -b -c

当程序prog.pm执行,那么变量$a,$b和$c就都被定义并设置为1。只有位于任何非开关变量或者“-- ”前的开关参数才会被处理。因此,下面的命令不会正常工作:
perl -s prog.pm -a -b 13 -c 6/6/2001

在这里,$a和$b被设置成1而@ARGV包含的是('13', '-c', '6/6/2001')。为了使$b的值为13而$c被设置成 6/6/2001 那么命令行应该如下:
perl -s prog.pm -a -b=13 -c=6/6/2001

一个更健壮的使用-s的方法是使用Getopt::Std或者Getopt:ong。这些模块会解析命令行并设置全局变量(与参数同名但是以opt为前缀)。在下面的例子里,-a是一个布尔参数,-b需要指定一个整数,-c需要的是一个字符串,而-d接受一个可选的字符串:
  1. use Getopt::Long;
  2. GetOptions("a!", "b=i", "c=s", "d:s");
复制代码
设置后的变量应该相应的是$opt_a, $opt_b, $opt_c, 和 $opt_d,
[color=#FF00FF]『有一种天空,喜欢接近阴霾 有一种生活,不知是否存在』  『有一种希望,注定走向毁灭 有一种死亡,渐渐被人期待』  『有一种心境,分辨不清好坏 有一种爱情,不再渴望表白』  『有一种眼泪,只能流向心底 有一种悲伤,从不表现出来』
返回列表