6.2 開檔關檔

Perl 處理檔案開啟的方式有以下幾種:(FHD 為檔案代碼)


* 唯讀 (以下二種方式作用相同)

      open(FHD, "檔名") || die "$!\n";
      open(FHD, "< 檔名") || die "$!\n";
       
* 開啟新檔,以供寫入

      open(FHD, "> 檔名") || die "$!\n";
       
* 開啟檔案,以增添附加的方式寫入

      open(FHD, ">> 檔名") || die "$!\n";
       
* 開啟舊檔,以供讀寫

      open(FHD, "+< 檔名") || die "$!\n";
       
* 開啟新檔,以供讀寫

      open(FHD, "+> 檔名") || die "$!\n";
       
* 開啟檔案,以供讀寫或增添附加

      open(FHD, "+>> 檔名") || die "$!\n";
       
* 開啟一道管線(pipe),以輸出至某一程式或命令

      open(FHD, " | 命令") || die "$!\n";
       
* 開啟一道管線(pipe), 以讀取某一程式或命令的結果

      open(FHD, "命令 |") || die "$!\n";
       

檔案處理完之後,應該養成良好習慣,將檔案關閉,方法如下:

    * close(FHD);

用例:

#!/usr/bin/perl

# 指定檔案名稱
$file_name="test.txt";

#-----------------------------------------------------------------
# 例一: 讀檔
#-----------------------------------------------------------------
# 唯讀模式開檔
open(FHD, "$file_name") || die "$!\n";

@all=<FHD>; # 讀出所有的檔案內容

# 或

while (my $line=<FHD>) {

	chomp $line;
    進一步處理 ....

}

# 關檔
close(FHD);

#-----------------------------------------------------------------
# 例二: 開新檔案以供寫入
#-----------------------------------------------------------------
# 開檔
open(FHD, "> $file_name") || die "$!\n";

#寫入
print FHD "Hello, world !\n";

# 關檔
close(FHD);

#-----------------------------------------------------------------
# 例三: 開啟檔案、增添資料
#-----------------------------------------------------------------
# 開檔
open(FHD, ">> $file_name") || die "$!\n";

# 增添
print FHD "Hey! What a lie!\n";

# 關檔
close(FHD);

用例一:

#! /usr/bin/perl

# 檔案路徑請自行修改:
$file="/home/ols3/tmp/index.html";

# 開檔
open(FHD, "$file") || die "$!\n"; 

# 讀出整份檔案內容
@all=<FHD>;

# 關檔
close(FHD);

$i=0;
foreach (@all) {
    $i++;
	# 印出每一列
    print;  # 作用對象為預設變數 $_
    # 只印計數前 10 列
    last if ($i > 10); # 若 $i > 10,last 會跳出迴圈
}

用例二:

#! /usr/bin/perl

# 執行法:
# chmod +x newcat.pl
# ./newcat.pl 路徑檔名
# 它會將該檔複製放入 newlog.txt 中

$file=$ARGV[0];

$log="newlog.txt";

open(FHD, "$file") || die "開啟 $file 失敗! 請檢查 $file !!!\n";

open(W, "> $log") || die "$!\n"; 

while (my $line=<FHD>) {

	print W $line;

}

close(W);
close(FHD);

用例三:

#! /usr/bin/perl

$csv="studdemo.csv";

open(FHD, "$csv") || die "無法讀取 $csv 檔! 請查明原因!\n";

while (my $line=<FHD>) {

	chomp $line;

	($f1, $name, $f3, $f4, $f5, $f6, $f7, $pslno, $par, $f10)=split(/,/ , $line);

    print "學生 $name 的身份證字號是 $pslno,其父為 $par 先生\n";
}

close(FHD);

# studdemo.csv 的內容如下:

代號,姓名,性別,入學年,班級,座號,生日(西元),身份證字號,父親姓名,母親姓名,郵遞區號,電話,住址(不含縣市?鎮),緊急聯方式
086011,林開廉,1,86,2,1,1996/2/5,L23456700,林xx,廖xx,435,262343827,下寮里中和街4號,0923-032870.26231296.
086012,柯政宇,1,86,2,2,1996/6/2,L14564300,柯xx,洪xx,435,67644381,文化里7鄰東建路1號,(母)0923-032870.
086013,張勛和,1,86,2,3,1996/7/28,N15544000,張xx,陳xx,435,26341262,安仁里5鄰梧棲路9號,0931-549242.
086014,林志成,1,86,2,4,1996/8/14,L18775000,林xx,童xx,435,265345337,中正里7鄰中興路18巷2,0953-6916677
086015,蔡庚江,1,86,2,5,1996/2/25,L23343000,蔡xx,鄒xx,435,23453422,中正里19鄰梧棲路11巷2號,26562451
086016,陳信宏,1,86,2,6,1996/6/5,L123253000,陳xx,鄭桂妙,435,4461943,中正里中興路18巷1弄12號,0921-728850.
086017,林德晉,1,86,2,7,1996/7/8,L133435000,張xx,,2634521,435,中正里3鄰仁美街3巷69號,26573434
086018,林承佑,1,86,2,8,1995/10/2,L779334000,林xx,林xx,2654348,434,南寮村8鄰中沙路2號,0912-667788.
086019,陳科全,1,86,2,9,1996/3/2,L1252343000,陳xx,黃xx,34534561,435,草湳里建國北街24號2樓,0923-243445.
086020,陳柏仁,1,86,2,10,1995/11/6,L125231000,陳xx,黃xx,25454542,435,草湳里1鄰梧南路2號之11,0923-300889.

用例四:將結果存在一個新檔 stu.log 中。

#! /usr/bin/perl

use strict;

my $file=$ARGV[0] || die "請至少要指定一個用逗點分開的 csv 資料檔名!!!\n";

my $log="stu.log";

open(FHD, "$file") || die "開啟 $file 失敗! 請檢查 $file !!!\n";

open(W, "> $log") || die "$!\n";

while (my $line=<FHD>) {

	chomp $line;

	my ($f1, $name, $f3, $f4, $f5, $f6, $birthday, $pslno, $papa, $nouse) = split(/,/  , $line);

	print W "學生:$name,生於:$birthday,其身份證字號為:$pslno,其父為:$papa\n";

}

close(W);
close(FHD);