|
Perl特别适合系统管理和Web编程
假如print的调用看起来像函数调用,它就是一个函数调用。
除非这样做会改变表达式的意义,否则perl的括号可以省略。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
PERL中的特殊变量:
1 die的处理方式:
$! : 根据上下文内容返回错误号或者错误串
$^E:在非UNIX环境中的操作系统扩展错误信息
~~~~~~~~~~~~~~~~~~~~~~~~~
2 模式匹配中的特殊变量:
$& 用来存放匹配中的值
$` 用来存放匹配中之前所有字符
$' 用来存放匹配中之后所有字符
******************************************************************
Perl文件读取的几种处理方式小结
*******************************************************************
1、单行(大文件处理)
my $oneline = <$FL>或者
while ($line = <H>)
{}
~~~~~~~~~~~~~~~~~~~
2、读取全部(小文件处理)
open(my $in, "path") or die "Can't open the file!\n";
my @lines = <$in>;
~~~~~~~~~~~~~~~~~~~~~~
3 、读3行(大文件及特殊处理需要):
open (my $in, "path ") or die "open error: $! ";
my @lines;
push (@lines, scalar <$in> ) for (1..3);
~~~~~~~~~~~~~~~~~~~~~~~~
4、每次按条件读入三行,并且按条件输出两行。或根据其他具体要求修改达到相应目的。
while (<TEST>) {
if(index ($_, "=") > -1){
my $position=tell(TEST);
my $keyword_line=$_;
my $line_1=<TEST>;
my $line_2=<TEST>;
# @a=split//,$keyword_line; 比较它们的元素是否相等,一直没成功
# @b=split//,$line_1; 利用if ($a[0]eq $a[0])来判断
# @c=split//,$line_2;
if (($line_2)&&(index($line_2, "=")>-1)){ # 或者if ($line_2=~/=/)
print OUTFILE "$_$line_1";
}
if (!($line_2)) { print OUTFILE "$_$line_1"; last; }
seek(TEST, $position, 0);
}
}
********************************************************************
第四章:子程序
********************************************************************
在Perl中,所有的子程序都有一个返回值,但并不是所有的Perl子程序都包含有用的返回值。
子程序中的最后一次运算的结果,都会被自动当成子程序的返回值。
sub marine {
$n += 1;
print "Hello, sailor number $n!\n";
}
调用子程序:&marine;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
返回值:
在Perl中,所有子程序*都有*一个返回值,
没有return的情况下,最后一次的运算结果就是返回值。
print语句的返回值,通常是1,代表输出成功。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
参数:
perl子程序可以有参数(argument),要传递参数列表到子程序里,只要在子程序调用的后面
加上被括号圈引的列表表达式,就行了。
$n = &max(10, 15);
perl会自动将参数列表化名为特殊的数组变量@_,该变量在子程序执行期间有效。
@_变量时子程序的私有变量。
子程序可以访问@_数组,以判断参数的个数和参数的值。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
词法变量——my:
my可以使用在任何块(block)中,而不是局限于子程序中的语句块。
词法变量的作用于受限于最内层的语句块。
*****my操作符并不会更改变量赋值时的上下文:********
my($sum) = @_;#列表上下文,和($sum) = @_相同,第一个参数
my $sum = @_;# 标量上下文,和$sum = @_相同,参数的个数
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
return操作符:
*********************************************************************
第5章:输入输出
*********************************************************************
读取标准输入
"行输入"操作符=><STDIN>
$line = <STDIN>
chomp($line);
或者:
chomp($line = <STDIN>)
如果读到文件结尾(end-of-line),行输入操作符就会返回undef。这样的设计是为了
配合循环使用,可以自然的跳出循环:
while (defined ($line = <STDIN>)) {
print “I saw $line”;
}
上式的简写:
while (<STDIN>) {
print “I saw $_”;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
钻石操作符:<>
参数的使用=>在程序运行时指定程序的输入源。
程序的调用参数(invocation arguments)是命令行上跟在程序后面的几个“单词”。
若不提供任何参数,程序会启动标准输入流。
(-)=>连字符参数=>代表标准输入。
钻石操作符是“行输入”操作符的特例=====>>>>> 它并不是从键盘中取得输入,而是从用户
指定的位置读取。
exp:
while(defined ($line = <>)) {
chomp($line);
print "It was $line that I saw!\n";
}
可以简写为:
while(<>) {
chomp;
print "It was $_ that I saw!\n";
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
调用参数:(不是子程序中的参数,而是调用程序时的所输入的参数)
@ARGV=>>>>>>由Perl解释器事先建立起来的特殊数组,其内容是调用参数组成的列表。
钻石操作符不是直接去检查参数,而是去读取@ARGV
shift @ARGV
foreach @ARGV
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
输出到标准输出:
print操作符会读取一个列表里的所有值,并把每一项(当然是一个字符串)
依次送到标准输出。
它在每一项之前或者之后都不会再加上额外的字符。
直接使用数组VS使用数组内插
print @array;#把数组的元素打印出来=>>>>>(abd)
print “@array”#打印出一个字符串(数组内插的结果)=>>>>>>(a b c)
print 后面的括号可有可无,下面的两种方法会输出一样的东西:
print ("Hello, world!\n");
print "Hello, world!\n";
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
文件句柄:(filehandle)=>全用大写
文件句柄是程序里代表Perl进程与外界之间的I/O联系的名字。它是这种联系的名字,
不一定是文件名。
*******************************************************************
第6章:HASH
*******************************************************************
HASH:就是一种数据结构。和数组类似。
和数组的区别:不是以数字来检索,而是以名字来检索。即键是保证唯一的字符串。
在哈希里,没有顺序,只有键/值对。
访问哈希元素:
$hash{$some_key}
%family_name
$family_name{"fred"} = "flintstone";
*********************************************************************
第7、8章:正则表达式
*********************************************************************
m//:可以简写为//;可以用任意成对定界符:() <> {}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
模式分组
()用来分组
反向引用
\1 \2 #用来引用圆括号中的模式所匹配的文字。
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
字符集
[.]#可能出现的字符集合,只匹配单个字符,可以是字符集里面的任何一个
简写:
\d => [0-9]
\w => [A-Za-z0-9_]
\s => [\f\t\n\r]#灵活的匹配空白,包括:换页、制表、换行、回车、空格。
\D => [^\d]
\W => [^\w]
\S => [^\s]
[?]#表示前一个条目是可有可无的 匹配前面的内容零次或者一次
#匹配前面的内容零次或多次
[+]#匹配前面的内容一次货多次
[.]#任何单字符的通配符
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
可选修饰符
/i#进行大小写无关的匹配。
/s #匹配任意字符,包括换行符
/x# 能够在模式里面加入空白
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
锚位:
(^)#是一个锚位,用来标示字符串的开头。
($)#是一个锚位,用来标示字符串的结尾
\b#单词边界锚位,匹配任何单词的首尾
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
*****************脱字符(^)的两个用途:******************
1-反义表示:在字符集匹配中表示要匹配的字符除外=>[^\s]=>匹配除空白之外的任何字符
2-开头锚位:在字符集之外,代表字符串的开头。=>/^\s*$/=>匹配空白行
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
绑定操作符
=~ #模式匹配任意对象。
默认的模式匹配的对象时$_,但是=~能让Perl拿右边的模式来匹配左边的字符串。
例子如:
my $some_other = " I dream of betty rubble ';
if ($some_other =~ /\brub/) {
print "Aye, there is the rub.\n";
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~
模式串中的内插
===>>>>>相当于UNIX中的grep命令
#!/usr/bin/perl -w
my $what = "larry";
while (<>) {
if (/^($what)/) {
print "We saw $what in beginning of $_";
}
$what 不一定来自字符串,也可以从@ARGV里的命令行参数取得: #@ARGV包含了
程序从命令行得到的所有参数 。
用例:my $what = shift @ARGV;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
捕获变量 $1 $2 $3...
===》》》捕获:把(圆括号中的模式所匹配的)部分字符串暂时记下来的能力
exp:
$_ = "hello there,neighbor";
if (/\s(\w+),/) {#捕获空白符和逗号之间的单词
print "the word was $1\n"; #打印the word was there
也可以一次捕获多个串:
$_ = "hello there,neighbor";
if (/(\S+) (\S+), (\S+)/) {
print "words were $1 $2 $3\n";#打印words were hello there neghor 没有逗号!
捕获变量的生命期;
不捕获模式:(?:)#告诉perl这完全是为了分组而存在
自动匹配变量:$& $` $'
#不必使用圆括号就能引入
exp:
if ("hello there, neighbor" =~ /\s(w+),/) {
print "That actually matched '$&' .\n";#第一个捕获there在$1 中,第二个捕获 there, 在$&中
}
if ("hello there, neighbor" =~ /\s(w+),/) {
print "That was ($`) ($&) ($') .\n";#匹配起始位置之前的字符串放在$`中,之后的在$'中。
}
****************************************************************************
第九章:用正则表达式处理文本
****************************************************************************
用s///替换 =》 只进行一次替换
exp:
$_ = "He's out bowling with Barney tonight.";
s/Barney/Fred/; #把barney替换为Fred。
print"$_\n";
用/g进行全局替换: =>/g修饰s///以达到全局替换的效果
exp
$_ = "home, sweet home!";
s/home/cave/g;
print"$_\n";#打印 “cave , sweet cave”;
将任何连续的空白转换成单一空格:
s/\s+/ /g;
去除结尾和开头的空白字符:
s/^\s+//;#删除开头的空白字符
s/\s+$//;#删除结尾的空白字符
s/^\s+|\s+$//g;#删除开头和结尾的空白字符
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
可选修饰符:
绑定操作符=~
大小写转换:
\U 和 \u
\L 和\l
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
split操作符: =>根据分隔符拆开一个字符串
exp:
@fields = split /separator/, $sting;
@fields = split /:/, "abc:def:g:h"#得到("abc", "def", "g", "h");
利用/\s+/ 模式进行空白分割:
my $some_input = "this is a \t test.\n";
my @args = split /\s+/, $some_input;#("this", "is", "a", "test.")
split默认会以空白字符分割$_:
my @fields = split;#等效于 split /\s+/, $_;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
join 函数:=>与split相反
exp:
my $x = join ":", 4, 6, 8;#$x is "4:6:8"
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
跨行的模式匹配:
接下来的程序会先把整个文件读入一个变量,然后把文件名前置于每一行的开头。
open FILE, $filename
or die "Can't open '$filename':$!";
my $lines = join ' ' ,<FILE>;
$lines =~ s/^/$filename: /gm;
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|