2009年(7)
分类:
2009-07-08 21:36:36
chomp($line=
while(
print "I saw $_";
}
# 不能将chomp 操作插入条件表达式
#
foeach(
....
}
区别:while读入一行进入循环再回到开头读入下一行。
foeach读入一个列表即在循环前读入所有行。
Perl调用参数:
$ ./my_program fred barney betty
# 运行当前目录下的my_program,它将处理文件fred,文件barney,最后是betty。
如果没有命令行参数,程序将处理标准输入流。作为一个特例,如果将连接号(-)作为一个参数,其含义也是标准输入。如果调用参数为fred – betty,其含义是程序将首先处理文件fred,其次是标准输入流,最后是文件betty。
<>操作符一种特殊的行输入操作:
while(defined($line=<>)){
chmop($line);
print "It was $line that I saw!\n";
}
运行次程序,给参数fred barney betty, 会依次读入文件并打印每一行(当前文件名字保存在Perl特殊标量$ARGV中,参数列表存在@ARGV数组里),读完后转入下一个文件参数,从一个文件到另一个文件之间没有空行,当使用<>时,就像输入的是一个大文件一样。如果输入结束时,<>将返回undef(同时退出while 循环)。(defined check undef will return false,and then while will be out...)
更简单的实现方式:
while(<>){
chomp; #chomp $_;
print "It was $_ that I saw!\n";
}
Perl Power Tools(PPT)项目 - 用Perl去实现几乎所有标准Unix工具
print的两个规则:
1.括号规则:如果括号有无不能改变语句的意义,则其是可选的。例如:
print ("Hello world!\n");
print "Hello world!\n";
2.函数调用规则:“看上去像函数调用”。
所谓看上去像函数调用的特点是:函数名后紧跟括号,括号中为参数。
如:print(2+3); 其就是函数调用,尽管是print...输出为5,然后返回一个值(true or false)
$result = print(“hello world\n”); #result的值为1
print (2+3)*4; #输出5,然后返回1表示print成功,然后1*4=4,此返回值没有保存在变量中被丢弃
(print (2+3)) * 4; #同上但更容易理解
printf:
格式符:%字母, 格式符和代表的元素一一对应.
printf "hello,%s; your password expires in %d days!\n", $user,$days_to_die;
%g-数字
%d-十进制整数, %x-十六进制, %o-八进制
printf "in %d days!\n", 17.85 #in 17 days!
数据宽度值 print"%6f\n",42 #print oooo42 (o is 空格)
%s-字符串
宽度值为负数意为左对齐(即空格补在后面)
%f可设置小数点后面几位数字:printf "%12.3f\n",6*7+2/3 #print oooooo42.667
输出百分号,%%
任意个format对应任意个元素的格式化打印
my @items =qw /li deng wu/;
my $format="The items are:\n".("%10s\n"x @items); 在标量context中返回元素个数,x操作符用来重复format的次数。
printf $format, @items; 在列表context中返回列表元素
句柄
Perl自带6个文件句柄 STDIN, STDOUT, STDERR, DATA, ARGV, ARGVOUT (句柄名建议大写)
程序从STDIN读入,结果写到STDOUT,错误写到STDERR
open句柄
open CONFIG, "li"; #打开CONFIG句柄,它指向li文件
open CONFIG, "
die的使用 类似于抛出异常
if(!open LOG,">>logfile"){
die "Cannnot create the logfile:$!";
}
# $!将表明错误,以及程序的名字和错误出现在多少行,用于debug。
# 如果不需要打印程序名于行数 则直接die "Cannnot create the logfile\n"; 消息后加换行符