標籤:上下文 分行符號 鍵盤
輸入與輸出
1、讀取標準輸入(鍵盤輸入的形式都稱標準輸入)
$line = ; #讀取下一行
chomp($line); #截掉最後的分行符號
chomp($line = ); #習慣用法,效果同上
如果讀到檔案結尾(end-of-file), "行輸入"操作符就會返回undef。這樣的設計是為了配合迴圈使用,可以自然地跳出迴圈:
while (defined($line = )) {
print "I saw $line";
}
while () {
print "I saw $_";
}
foreach () {
print "I saw $_";
}
注意: 在while迴圈和foreach的迴圈時是不同的,while迴圈時,perl會讀取一行輸入,把它存入變數並且執行迴圈的主體。接下來,它會回頭去尋找其他的輸入行。但是在foreach迴圈裡,“行輸入”操作符會在列表上下文中執行(因為foreach需要逐項處理列表的內容)。為此,在迴圈能夠開始執行之前,它必須先將輸入全部讀進來。假如輸入來自4000M大小的WEB伺服器記錄檔,他們的差異會十分明顯!因此最好的做法,通常是盡量使用while迴圈的簡寫,讓它每次處理一行。
2、鑽石操作符輸入
perl中有一種讀取輸入的方法,就是使用 鑽石操作符<>。
例如:
[[email protected] aaa]# cat aaa.txt
aaa
bbb
ccc
[[email protected] aaa]# cat test2.pl
#!/usr/bin/perl
#test2
while (<>) {
chomp; #不加參數時,chomp會直接作用在$_上。節約按鍵,從小地方做起。
print "I was $_ that I saw!\n";
}
[[email protected] aaa]# ./test2.pl aaa.txt
I was aaa that I saw!
I was bbb that I saw!
I was ccc that I saw!
注意:假如鑽石操作符無法開啟某個檔案並讀入內容,便會顯示相關的出錯診斷資訊,就像:
不能開啟wilma:無此檔案或目錄(can‘t open wimal: No such file or directory)
然後鑽石操作符會自動跳到下一個檔案,就像cat或其他標準工具程式的做法一樣。
3、鑽石操作符調用參數
鑽石操作符其實不回去檢查調用參數,它的參數其實是來自@ARGV數組,這個數組是perl實現內建起來的特殊數組。
鑽石操作符會查看數組@ARGV以決定該用哪些檔案名稱,如果它找到的是空列表,就會該用標準輸入資料流;否則,就會使用@ARGV裡的檔案清單。
例如:
[[email protected] aaa]# cat 1.txt
nihao
beijing
[[email protected] aaa]# cat 2.txt
nihao
shanghai
[[email protected] aaa]# cat 3.txt
nihao
guangzhou
[[email protected] aaa]# cat test2.pl
#!/usr/bin/perl
#test2
@ARGV = qw# 1.txt 2.txt 3.txt #; #強制讓鑽石操作符讀這三個檔案。
while (<>) {
chomp;
print "I was $_ that I saw!\n";
}
[[email protected] aaa]# perl test2.pl
I was nihao that I saw!
I was beijing that I saw!
I was nihao that I saw!
I was shanghai that I saw!
I was nihao that I saw!
I was guangzhou that I saw!
4、標準輸出
print <>; #和Unix下的cat類似
print sort <>; #和Unix下的sort命令功能差不多。
print (2+3); #它會列印5。
5、使用 printf格式化列印輸出
[[email protected] ~]# cat test.pl
#!/usr/bin/perl
#test
$user = zhangsan;
$days_to_die = 30;
printf "Hello, %s; your password expires in %d days!\n", $user, $days_to_die; #%s 指定字串格式, %d指數字格式
[[email protected] ~]# perl test.pl
Hello, zhangsan; your password expires in 30 days!
[[email protected] ~]# cat test.pl
#!/usr/bin/perl
#test
$user = zhangsan;
$days_to_die = 30;
printf "Hello, %s; your password expires in %d days!\n", $user, $days_to_die;
printf "%g %g %g\n", 5/2, 51/17, 51 ** 17;
printf "in %d days!\n", 17.85;
printf "%6d\n", 42;
printf "%2d\n", 2e3 + 1.95;
printf "%10s\n", "wilma";
printf "%-10s\n", "wilma";
printf "%12f\n", 6 * 7 + 2/3;
printf "%12.3f\n", 6 * 7 + 2/3;
printf "%12.0f\n", 6 * 7 + 2/3;
printf "Monthly interest rate: %.2f%%\n", 5.25/12;
[[email protected] ~]# perl test.pl
Hello, zhangsan; your password expires in 30 days!
2.5 3 1.0683e+29
in 17 days!
42
2001
wilma
wilma
42.666667
42.667
43
Monthly interest rate: 0.44%
6、檔案控制代碼
有六種特殊檔案控制代碼是Perl保留的,它們的名字是STDIN、STDOUT、STDERR、DATA、ARGV和ARGVOUT。雖然你可以選擇任何喜歡的檔案控制代碼名,但不應使用保留的名字,除非確實需要以特殊方式使用上述六個控制代碼。
7、開啟檔案控制代碼
open CONFIG, " open BEDROCK, ">fred";
open LOG, ">>logfile";
my $selected_output = "my_output";
open LOG, "> $selected_output";
在相對新的Perl(5.6版之後)中,open另有一種使用三個參數的寫法:
open CONFIG, "<", "dino";
open BEDROCK, ">", $file_name;
open LOG, ">>", &logfile_name();
8、關閉檔案控制代碼
close LOG;
close CONFIG;
close BEDROCK;
9、使用檔案控制代碼
print LOG "北京歡迎你!\n";
printf STDERR "%s.\n", aasdf;
10、改變預設的檔案輸出控制代碼
select BEDROCK;
print "I hope Mr. Slate doesn‘t find out about this.\n";
print "Wilma!n";
預設情況下,假如你不為print(printf)指定檔案控制代碼, 它的輸出就會送到STDOUT。不過你可以使用select操作符來改變預設的檔案控制代碼。
$I=1,如果你想改回原先的STDOUT,可以用它
本文來源:http://www.benet.wang/perl%E7%BC%96%E7%A8%8B/89.html";
本文出自 “江湖笑笑生” 部落格,請務必保留此出處http://xuexuhui.blog.51cto.com/9647696/1663767
perl自學筆記整理