行輸入操作在到達檔案的結尾時將返回
undef
,在while迴圈的條件中不能使用chomp:
while (defined($line = ))
在迴圈的內部,我們將看到每一行,一行接著一行,perl提供簡寫:
while()
while (defined($_ = ))
兩者是等同的
在進行深入討論前,我們要澄清一些事:這種簡寫只在特定的情況下有效,預設的情況下不會將一行讀入變數
$_。僅當
while
迴圈的條件判斷部分只包含行輸入操作才有效。
對於foreach
用法有些區別:
foreach()
在while
迴圈中,
perl
讀入一行,將它賦給變數,然後進入迴圈。再回到開頭,讀入下一行。在
foreach
迴圈中,由於行輸入操作在列表的
context
中使用,因為
foreach
需要乙個列表作為其引數。
這一點影響很多,一次讀一行和一次讀乙個檔案差別很大。
引數為要被程式順序處理的檔名。
尖括號操作(
<>
)是一種特殊的行輸入操作,其輸入可由使用者選擇:
可以使標準輸入,也可以使命令列引數。
while (defined($line = <>))
由於這是一種特殊的行輸入操作,我們也可以使用前面的相似的簡寫方法:
while(<>)
輸入結束時,
<>
將返回undef
(同時退出
while
迴圈)技術上講,
<>
從陣列@argv
中得到呼叫引數。這個陣列是
perl
中的乙個特殊陣列,其包含呼叫引數的列表,程式本身的名字
存在perl
的特殊變數
$0 中,而非
@ragv。
<>
操作檢視
@argv
來決定使用哪些檔案。如果表為空,則使用標準輸入流;否則,使用其找到的相應檔案。
在啟動程式後,使用
<>
之前,你還有機會修改
@argv
的值。例如,下面程式可以處理
3 個指定的檔案,無論使用者在命令列中輸入了什麼其它的檔案:
@argv = qw# larry mor curly #; #
強制使用這三個檔案
while(<>)
1.print
通常,需要把程式的輸出先快取起來。將要輸出的內容先快取起來,等到有足夠的內容再輸入,而非立刻就輸出。例如,假設要把輸出的內容存入磁碟,如果有乙個或兩個字元就立刻輸出到磁碟中,這將非常緩慢和低效。一般,先將要輸出的內容存入乙個快取(buffer)中,當快取滿時,再將其輸出。
2.使用printf 格式化輸出
#! /usr/bin/perl
use strict ;
use warnings ;
my $int = 10 ;
my $double = 20.5 ;
my $float = 30.5e10 ;
# %g 自動選擇
printf "%g\n",$int ;
printf "%g\n",$double ;
printf "%g\n",$float ;
#%d,%x,%o
printf "%d\n",$int ;
printf "%x\n",$int ;
printf "%o\n",$int ;
# %nd 十進位制整形輸出,刪除小數部分
printf "%f\n",$double ;
printf "%d\n",$double ;
#長度和對齊
printf "%10d\n",$int ;
printf "%-10d\n",$int ;
printf "%-10.3f\n",$double ;
#陣列
my @items = qw;
printf "the items are:\n".("%10s\n"x@items), @items;
perl
自身有六個檔案控制代碼:
stdin
,stdout
,stderr
,data
,argv
,argvout
open config, 「dino」;
open config, 「輸入
open bedrock, 「>fred」;
輸出open log,「>>logfile」;
追加open
支援「3
引數」型別:
open config, 「<」, 「dino」;
open bedrock, 「>」, $file_name;
open log, 「>>」, &logfile_name();
這種方法的優點是
perl
不會將模式(第二個引數)和檔案的名字(第三個引數)混淆,這能增加安全性
開啟時,可能出現因為檔案不存在&許可權等問題,控制代碼bad情況。 1.
如果從乙個bad 檔案控制代碼讀入(檔案控制代碼沒有恰當的開啟),會立刻到達檔案結尾(end-of-file) 2.
如果寫到乙個bad 檔案控制代碼,資料會被悄悄地丟掉
使用控制代碼時需要判斷:
my $success = open log, 「>>logifle」; #
將返回值儲存在
$success
中if(!$success)
close
控制代碼名;
當關閉檔案控制代碼時,perl 將告訴作業系統已經結束了對此資料流的操作,因此應當將輸出的資料寫到磁碟中.
如果程式重新開啟它(也就是說,使用
open
重新開啟此檔案控制代碼),或者退出程式,
perl
將自動關閉檔案控制代碼.
1.輸入控制代碼
if(! open passwd, 「/etc/passwd」)
while()
2.輸出控制代碼 寫出
(>
)或追加的
(>>
)的檔案控制代碼
可以和print
或printf
結合使用
printf (stderr 「%d percent complete.\n」, $done/$total * 100);
printf stderr (「%d percent complete.\n」, $done/$total * 100);
3.預設控制代碼
預設情況下,如果不指定檔案控制代碼給
print(或者
printf
,這裡的內容對兩者均適用
),則缺省會使用
stdout
。但這個預設屬性,可以通過
select
操作進行更改。
#! /usr/bin/perl
#######################
#讀檔案加行號寫入新檔案
#######################
use strict ;
use warnings ;
my $format = __file__ . "-" . __line__ . ": %s";
if(!open log ,">>", "./log.20130911")
if(!open src ,"< ./find.plx")
select log ;
my $line=0 ;
while()
close log ;
close src ;
Perl語言學習筆記 5 輸入與輸出
1 讀取標準輸入 chomp line 2 判斷是否讀到檔案末尾 defined line 3 讀取檔案內容 while foreach while與foreach的差別 while一次讀取一行,foreach一次讀取全部,然後對列表進行迴圈,最好用while 4 鑽石操作符 根據呼叫引數,從指定地...
perl學習筆記 輸入與輸出
注意 1,會處理所有的輸入,直到所有輸入的結尾為止 一般在乙個程式中只有乙個 若出現多次則可能發生錯誤。2,呼叫引數 ar ar 是乙個裝著呼叫引數的陣列 1,讀取從鍵盤輸入的值 注意 只讀取鍵盤輸入的一行,到換行符結束 用chomp去掉換行符 若沒有賦值給變數,則預設存在 中 usr bin pe...
perl處理輸入和輸出 3
宣告 本神奇的perl系列為劉興 這段程式有幾處耐人尋味 1 name,price split carmes name,price 表示乙個列表,列表可以理解為標量的有序集合,列表 儲存著資料的集合,而陣列可理解為儲存著列表的變數。列表可用用 元素 1,元素 2,元素 3,元素 n 的方式表示。這句...