PERL 学习笔记
Getopt
PERL 学习笔记Perl Getopt 详解例1例2Perl Hash 常见的用法基本用法清空Perl Hash判断Perl Hash是否包含key想要知道一个hash存放多少数据遍历一个Perl HashReference引用传递Perl Hash到函数函数返回hash,或者hash引用(hashreference)
Perl Getopt 详解
例1
xxxxxxxxxx
#!/usr/bin/perl -w
use ;
use ::;
use qw($opt_a $opt_b $opt_c);
('a:b:c:');
print "\$opt_a => $opt_a\n" if $opt_a;
print "\$opt_b => $opt_b\n" if $opt_b;
print "\$opt_c => $opt_c\n" if $opt_c;
xxxxxxxxxx
:\\\> . - - -
$opt_a =>
$opt_b =>
$opt_c =>
xxxxxxxxxx
#!/usr/bin/perl
use ::;
use qw($opt_a $opt_b $opt_c);
(
"a=s"=>\$opt_a,
"b|opt_b:i"=>\$opt_b,
"c"=>\$opt_c
);
print "\$opt_a => $opt_a\n" if $opt_a;
print "\$opt_b => $opt_b\n" if $opt_b;
print "\$opt_c => $opt_c\n" if $opt_c;
注释:'a :b :c',a和b后有冒号,表示-a,-b后面要跟参数.c后面没有冒号,表示-c后面不带参数. 而且-a,-b后所跟的参数分别赋给变量$opt_a和$opt_b,对于变量$opt_c,若命令行加了-c,则$opt_c=1,否则为0.: 如
perl getopt.pl -a aa -b bb -c cc 显示: opt_a =>;aa opt_b =>;bb opt_c =>;1 如: perl getopt.pl -a aa -b bb opt_a =>;aa opt_b =>;bb (因为加了if判断,所以$opt_c没有显示);
例2
xxxxxxxxxx
#!/usr/bin/perl
use ::;
::::( 'page=i' => \$page,'onoff!' => \$onoff, 'help' => \$wants_help, 'name=s' => \$name, 'number:i' =>\$number);
if(defined($page))
{
print "page flag set to $page "
}
if(defined($onoff))
{
print "onoff flag set to $onoff ";
}
if(defined($wants_help))
{
print "help flag set to $wants_help ";
}
if(defined($name))
{
print "name flag set to $name ";
}
if(defined($number))
{
print "number flag set to $number ";
}
xxxxxxxxxx
#!/usr/bin/perl
use ;
use ::;
use ::;
my @libs = ();
my %flags = ();
my ($verbose, $all, $more, $diam, $debug, $test, $step);
(
'verbose+' => \$verbose,
'more!' => \$more,
'debug:i' => \$debug,
'lib=s' => \@libs,
'flag=s' => \%flags,
'test|t' => \$test,
'all|everything|universe' => $all,
);
### $verbose
### $more
### $debug
### $test
### @libs;
### %flags
这就是使用的方法,下面是详细解释,注意看 GetOptions 中的 => 前面的部分.下面是详解 •'verbose+' 接有 + 的选项不接收变量,后面不需要加内容.直接使用就行了,会在每次出现时增加一次变量,就是讲命行时在参数中 -verbose -verbose 出现二次时 verbose 的值就会变成 2. •'more!' 接有 ! 的选项不接收变量(也就是讲后面不需要加参数 –more 来使用就行了),只要命令行中出现了这个参数,就会默认是 1 ,是用来设置打开和关掉一个功能的>.可以在参数前加 no 变成负的例如-nomore. •'flag=s' 接有 = 的字符串要求接字符串(s)、整数(i),或者浮点(f)等类型的变量. •'debug:i' 接有 : 的选项会接受缺省为0或者为空字符串的可选变量 •'test|t' 接有 | 的选项表示可以给 –test 简写为 -t. 'lib=s' => @libs 如果相关联的变量是个数组, 如这个地方的 @libs, 那么选项可以多次出现, 值可以被推到数组里. •‘flag=s' => %flags 如果相关联的变量是个散列, 那么就要求一个键=值(key=value)对, 并被插入到散列里. 备注:```
在匹配参数名的时候,GetOptions 在缺省设置下会忽略大小写,默认参数被简写为唯一的最短字符串(首字母)(例如,-m 代表 -more. 相同的首字母时,会加上第二个字母来区分) Getopt 模块的程序使用的方法:
根据上面的例子,比如我们写了一个程序叫 test.pl .我们只需要在命令行中加如下参数:
复制代码代码如下: $ ./test.pl --verbose --verbose -v --more \ --lib='/lib' -l '/lib64' --f a=1 --flag b=2 --debug 2 -t fukai
有点小长,在看看上面的,就会明白意思了.在这个地方,我使用了 Smart::Comment 模块,所以在最下面的 ### 是会输出这个变量本身的内容的.这也是一个超级强大的模块.我们来看看输入这些参数后.会输出什么内容吧.
Perl Hash 常见的用法
基本用法
#初始化%h为空数组 %h={}; #用数组初始化%h为a=>1,b=>2 %h=('a',1,'b',2); #意义同上,只是另一种更形象化的写法。%h=('a'=>1,'b'=>2); #如果key是字符串,可以省略引号。下面这行和上面那行是一样的%h=(a=>1,b=>2); #用{}来访问print “$h{a}\n”; #打印 $h{b}='2b'; print “$h{b}\n”; #打印2b #删除key用delete delete$h{b}; #从$h删除'b'
清空Perl Hash
undef %h; 得到hash的所有键值 #得到所有keys,顺序取决于hash函数,或者说是乱序@all_keys=keys%h; #所有键值,是按hash的值从大往小排列的。值的比较是数字比较(比如说,10>9) , @all_keys=sort{$h{$b} => $h{$a}}(keys%h);
判断Perl Hash是否包含key
exists($h{$key}); Perl Hash的长度
想要知道一个hash存放多少数据
$hash_size=keys%h #把%h的长度放到$hash_size中print scalar keys %h,"\n"; #打印%h的长度。这里用了scalar来返回数组长度。
遍历一个Perl Hash
while(my($k,$v)=each%h){print"$k--->$v\n";}
Reference引用
Reference类似于C/C++的指针 $h_ref=\%h; #获得一个hash的reference, %aHash=%{$h_ref}; #把hash reference当成hash用 $value=$h_ref->{akey}; #这个和%h{akey}是一样的
传递Perl Hash到函数
一般都是传递一个reference到函数 %h=(); $h{a}=1; foo(\%h); print $h{b},"\n"; #打印出2。这个值来自于函数foo(), sub foo{my ($h)=@_; print $h->{a},"\n"; #打印出1 $h->{b}=2;}
函数返回hash,或者hash引用(hashreference)
函数可以返回Perl Hash sub foo{my %fh; $fh{a}=1; return %h;} my %h=foo(); print "$h{a}\n"; #打印出1 但是这样等于把整个hash从%fh复制到了%h,效率比较低。可以考虑返回hash的引用: sub foo{my %fh; $fh{a}=1; return \%fh;} my $hr=foo(); print "$hr->{a}\n"; #打印出1. my %h=%{foo()} #如果就是想复制,也可以用这种方法。不用担心在sub foo里的%fh是局部变量,Perl会自动管理内存。它会发现%fh被$hr引用,就不会清理%fh的内存,并且$hr失效后释放内存。

浙公网安备 33010602011771号