Perl中有一个叫做%ENV的环境变量,和其它的HASH散列一样,它可以被赋值,被打印。
永久赋值的方法:
Windows下:我的电脑->属性->高级->环境变量
Linux/Unix下: export KEY="value"
删除环境变量:unset KEY
Ctrl+z可以终止程序!!!!
perl中的钻石操作符
钻石操作符<>是perl的读取文件(文件名通过参数传入,即@ARGV数组。如果@ARGV为空,则改用标准输入流)每一行的操作符,让perl程序也能像cat,sed等应用程序直接处理文本文件。是一个整行输入操作符的特例。
钻石操作符:<>
它能让程序在处理调用参数时,提供类似于标准unix工具程序的用法。若时不提供任何调用参数,程序应该改成出来标准输入流。但有个特例;如果某个参数是连字符(-),那耶代表标准输入。
钻石操作符是整行输入操作符的特例,例如:
while (defined($line = <>) {
chomp ($line);
print "It was $line that I saw! ";
}
既然是整行输入操作符的一种特例,因此可以使用先前我们所看到的简写,将输入读取到默认的$_里:
while (<>) {
chomp;
print "It was $_ that I saw; ";
}
严格来说,钻石操作符并不好真的去检查调用参数,它靠的是@ARGV数组。这个数组是由perl解释器事先建立的特殊数组,其内容就是调用
参数所组成的列表。
钻石操作符如何绝对使用那些文件名?方法如下:它会查找@ARGV,如果它找到的是空列表,就会改用标准输入流;否则,就会使用@ARGV里的文件列表。这表示程序开始运行之后,只要尚未使用钻石操作符,就都可以对@ARGV动点手脚。举例来说,我们可以不管用户在命令行指定了什么,而是一律出来3个特定的文件:
@ARGV = qw / larry moe curly /;
while (<>) {
chomp;
print "It was $_ that I saw in som stooge-like file! ";
}
print <> ;
cat 的perl实现,
print sort <> ; sort的perl实现
<>的另一个例子,通过打开的文件描述符
open(HANDLE,"c:/test.txt")
or
die
"文件不能打开";
while
()
#注:这就是对文件句柄读取一行并存入变量
$_
{
print;
#注:打印变量
$_
}
以在windows操作系统为例,当我们在命令行中调用PERL程序的时候,我们往往会跟随一些参数,比如输入文件名,和输出文件名之类的信息。这些信息PERL会将它们存储在@ARGV数组中(和C语言一样)。比如在cmd中输入如下命令:
pp.pl -opcamfile opcamfile.ini -rcfile rcfile.txt -swapfile swapfile.tmp -outfile outfile.txt
PERL会建立一个数组@ARGV=qw/-opcamfile opcamfile.ini -rcfile rcfile.txt -swapfile swapfile.tmp -outfile outfile.txt/;然后我们想把这些信息做何用出就对应的处理数组,从数组中分离我们想要的数据就可以了。}
捕获变量:
捕获的功能指的是:把圆括号中模式所匹配的部分字符串暂时记忆下来的能力。如果有一对以上的圆括号。就会有一次以上的捕获。每个被捕获的对象是原本的字符串,而不是模式。
因为捕获标量存储的都是字符串,所以他们都是标量变量。 在Perl中,被捕获的字符串被存储在$1,$2,$3....中。
Perl 的正则表达式中如果出现 () ,则发生匹配或替换后 () 内的模式被 Perl 解释器自动依次赋给系统 $1, $2 ......
下面例子:
$_ = "abc
def, ghi";
if(/(\S+)
(\S+), (\S+)/)
{
print "$1 $2 $3\n";
}
解释:
\s | 匹配任意的空白字符,如空格、制表符、换行符、中文全角空格等 |
\S | 匹配任意的非空白字符(大写相反) |
Perl双引号和单引号的区别:
1)单引号:
它将单引号中的内容包括Perl双引号完整输出,同时即使引号中包含了变量或标量,都将被作为字符处理,如下
$a=5;
print'$a';
结果将输出$a。
仅当后面所跟的字符是反斜杠或单引号时,反斜杠才有意义。
双引号:
双引号:和单引号内的字符串一样,它也是一连串的字符,不过是被括在一对双引号里面。但是现在反斜线具有完整的能力,可用来表示控制字符或通过八进制及十六进制来表示任何字符。如\n, \r,\t等特殊转义。
总结:
一、双中有双,单中有单都需要\ 转义。
二、双中有单或单中有双均不需要转义。
三、单引号直接了当,引号内是什么就显示什么,双引号则需要考虑转义或变量替换等。
特殊运算符:
2**3 表示2的3次方,等于8.(指数运算符)
10%3,10除以3的余数,等于1.取模运算符
字符串拼接运算符:
"hello" . "world" 等同于"helloworld"
字符串重复运算符:,用一个小写字母x来表示
"fred" x 3 就是"fredfredfred"
$a = $a + 5;等同于 $a +=5;
类似的
$str = $str . " "; 等同于 $str .= " ";
字符串拼接运算符
$a**=3; 表示取$a中的数值的三次方,结果放回$a中。 其他二元复制运算符类似。
列表构造函数
@a = (1..5); 等于 @a = (1,2,3,4,5);
@a = (2..6,10,12); 等于 @a = (2,3,4,5,6,10,12)
@name = qw(fred
barne
betty
wilma
};
等于
@name = ("fred","barne","betty","wilma");
数组引用用$
@name 的第一个元素是$name[0]
数组片段用@
@name 的一个片段:
@name[1,2]
foreach
Perl foreach从列表(数组)的第一个元素一直循环执行到最后一个元素,一次迭代一个。
@a = (1,2,3,4,5);
foreach $b (reverse @a)
{ print #b;}
输出54321。
当然也可以使用默认变量$_:
@a = (1,2,3,4,5);
foreach (reverse @a)
{ print;}
哈希
#初始化%h为空数组 %h={};
#用数组初始化%h为a=>1,b=>2
%h=('a',1,'b',2);
哈希元素的存取
要访问hash 元素,可以使用下面的语法:$hash{$some_key}
这和访问数组元素的方法有些类似,这里下标(key)上使用的是花括号({}),而不是方括号([ ])。现在key 的表达式是字符串,而非数字。
.作为整体的hash
要引用整个hash,使用百分号(%)作为前缀。
为了方便,hash可以转换为列表,或者反过来。
Hash 赋值
可以使用如下的语法在hash 之间拷贝:
%new_hash = %old_hash;
将hash转变成其它形式更加常见。例如,我们可以将hash反转:
%inverse_hash = reverse %any_hash;
大箭头符号(=>)
当给hash赋值时,有时并不明显哪些元素是keys,那些是values,因此发明了大箭头符号(=>)。在需要逗号的时候,都可以使用大箭头符号替换。
如:
my %last_name = (
"www" => 1,
"eee" => 2,
);
哈希函数
某些有用的函数可以对整个hash 进行操作。
1.keys和values函数
keys函数会返回此hash的所有keys,values函数将返回所有的values。如果hash中没有元素,则此函数将返回空列表。
my %hash = ("a"=>1, "b"=>2, "c"=>3);
print my @k = keys %hash;
print my @v = values %hash;
2.each函数
如果想迭代hash的每一个元素,一种通常的方法是使用each函数,它将返回key/value对应的2个元素列表。
当对同一个hash 函数进行一次迭代时,将返回下一个key/value对,直到所有的元素均被访问。如果没有更多的key/value对,则each函数将返回空表。
my %hash = ("a"=>1, "b"=>2, "c"=>3);
while(($key, $value) = each %hash)
{
print "$key => $value\n";
}
当然,each返回的key/vlaue对,顺序是混乱的(它其顺序和keys和values函数返回的顺序相同)。如果想将其按序排放,可以对它们排序(使用sort)。
my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4);
foreach $key (sort keys %hash)
{
$value =$hash{$key};
print "$key => $value\n";
}
四、哈希的通常用法
1.exists函数
要查看hash中是否存在某个key,可以使用exists函数,如果hash中存在此key,则返回true,与是否有对应的value无关。
my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4);
if(exists $hash{'a'})
{
print "true";
}
2.delete 函数
delete函数将某个给定的key(包括其对应的value)从hash中删除。如果不存在这个key,则什么也不做,不会有警告或者错误信息。
my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4);
delete $hash{'a'};
foreach $key (sort keys %hash)
{
$value =$hash{$key};
print "$key => $value\n";
}
3.hash 元素的内插
你可以在双引号的字符串中使用单个hash元素,但不支持整个hash 的内插。
my %hash = ("a"=>1, "b"=>2, "c"=>3, "d"=>4);
foreach $key (sort keys %hash)
{
print "$key => $hash{$key}\n";
}
哈希表片段:
比如一个桌球俱乐部有10个人,每个人有一个分数。做成一个哈希表%score。想要对其中三个人的分数赋值:
$score{"fred"} = 123;
$score{"barney"} = 446;
$score{"dino"} = 789;
这样有点啰嗦。
可以写成:
{ $score{"fred"},$score{"barney"},$score{"dino"} } = (123,446,789);
更简单的是:
@score{"fred","barney","dino"} = (123,446,789);
子程序
在Perl 中,会自动将此参数列表(此参数列表的另一个名字)自动存放在一个叫做@_的数组中。子程序可以访问此数组变量来确定此参数的个数以及其值。
这也就是说此子程序参数的第一个值存放在$_[0]中,第二个存放在$_[1],依次类推。但必须强调的是这些变量和$_这个
变量没有任何关系。
@_是子程序的一个私有变量;
sub add{$_[0] + $_[1]};
print add(3,4);
返回7
注意子程序定义的后面用的是{ } 而不是(),否则会出现malformed prototype for main。。。之类的报错
调用子程序时使用()括住参数。
say("me")+say("you");
sub say {print "hello, $_[0]!\n";}
显示:
hello, me!
hello, you!
返回值
表达式为真时的语句块;
print"您的分数及格了!\n";
判别式一为真时的语句块;
判别式一为假时的语句块;
判别式一为真时的语句块;
判别式二为真时的语句块;
判别式三为真时的语句块;
所有判别式为假时的语句块;
判别式为假时语句块;
程序叙述区块;
程序叙述区块;
程序叙述区块;
程序叙述区块;
last
会立刻结束循环。(这同C 语言或其它语言中的“break”语句类似)。
while(){
if(/stop/){
last;
}elsif(/fred/){
print;
}
}
##last跳转到这里##
next
之后,又会进入下一轮循环(这和C 或者类似语言的“continue”相似)
my @words = qw{ fredbarney pebbles dinoWilma betty };
my $errors = 0;
foreach (@words)
{
##redo 跳到这里##
print "Type the word $_: ";
chomp(my $try = );
if($try ne $_){
print "sorry ?That’s not right.\n\n";
$errors++;
next;
}
print "This word is right.\n\n";
#跳转到这里
}
print "You’ve completed the test, with $errors error\n";
循环控制的第三个操作是redo。它会调到当前循环块的顶端,不进行条件表达式判断以及接着本次循环。(在C 或类似语言中没有这种操作。)
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |