perl學習 5 輸入和輸出

2021-06-18 08:30:15 字數 3923 閱讀 1864

行輸入操作在到達檔案的結尾時將返回

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 的方式表示。這句...