Perl map 函数应用实例

发布时间:2020-05-15编辑:脚本学堂
map函数,它使用一个列表,并对每个元素以一个指定的代码块或者表达式进行求值运算,然后返回所有结果的一个列表。在代码块中,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::Long。这些模块会解析命令行并设置全局变量(与参数同名但是以opt为前缀)。在下面的例子里,-a是一个布尔参数,-b需要指定一个整数,-c需要的是一个字符串,而-d接受一个可选的字符串:
 

复制代码 代码如下:
use Getopt::Long;
GetOptions("a!", "b=i", "c=s", "d:s");

设置后的变量应该相应的是$opt_a, $opt_b, $opt_c, 和 $opt_d。