PERL 学习笔记

<!doctype html>Perl Getopt 详解

Getopt 

Perl Getopt 详解

例1

 
 
 
xxxxxxxxxx
10
 
 
 
 
1
#!/usr/bin/perl -w 
2
use strict; 
3
use Getopt::Std;   
4
5
use vars qw($opt_a $opt_b $opt_c);
6
getopts('a:b:c:');   
7
8
print "\$opt_a => $opt_a\n" if $opt_a; 
9
print "\$opt_b => $opt_b\n" if $opt_b; 
10
print "\$opt_c => $opt_c\n" if $opt_c;
 
 
 
 
 
xxxxxxxxxx
4
 
 
 
 
1
H:\Program\Perl\getOpt>perl getOpt.pl -a hello -b world -c good
2
$opt_a => hello
3
$opt_b => world
4
$opt_c => good
 
 
 
 
 
xxxxxxxxxx
13
 
 
 
 
1
#!/usr/bin/perl
2
use Getopt::Long;
3
use vars qw($opt_a $opt_b $opt_c);
4
5
GetOptions(
6
"a=s"=>\$opt_a,
7
"b|opt_b:i"=>\$opt_b,
8
"c"=>\$opt_c
9
);
10
11
print "\$opt_a => $opt_a\n" if $opt_a; 
12
print "\$opt_b => $opt_b\n" if $opt_b; 
13
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
29
 
 
 
 
1
#!/usr/bin/perl 
2
use Getopt::Long; 
3
Getopt::Long::GetOptions( 'page=i' => \$page,'onoff!' => \$onoff, 'help' => \$wants_help, 'name=s' => \$name, 'number:i' =>\$number);   
4
if(defined($page))
5
{
6
    &nbsp;
7
    &nbsp; 
8
    print "page flag set to $page "
9
}
10
if(defined($onoff))
11
{ 
12
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
13
    print "onoff flag set to $onoff "; 
14
} 
15
if(defined($wants_help))
16
{ 
17
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
18
    print "help flag set to $wants_help "; 
19
} 
20
if(defined($name))
21
{
22
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
23
    print "name flag set to $name "; 
24
}
25
if(defined($number))
26
{ 
27
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
28
    print "number flag set to $number "; 
29
}
 
 
 
 
 
xxxxxxxxxx
25
 
 
 
 
1
#!/usr/bin/perl 
2
use strict; 
3
use Getopt::Long; 
4
use Smart::Comments; 
5
6
my @libs    = ();  
7
my %flags   = ();  
8
my ($verbose, $all, $more, $diam, $debug, $test, $step); 
9
10
GetOptions( 
11
        'verbose+'  => \$verbose, 
12
        'more!'     => \$more, 
13
        'debug:i'   => \$debug, 
14
        'lib=s'     => \@libs, 
15
        'flag=s'    => \%flags, 
16
        'test|t'    => \$test, 
17
        'all|everything|universe' => $all, 
18
); 
19
20
### $verbose 
21
### $more 
22
### $debug 
23
### $test 
24
### @libs; 
25
### %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失效后释放内存。

posted @ 2020-04-15 01:18  奋斗宝宝冷风  阅读(145)  评论(0)    收藏  举报