Perl 學習筆記 目標操作

2022-03-15 14:57:45 字數 2899 閱讀 4636

1.在目錄樹中移動.

程式執行時會以當前工作目錄作為相對路徑的起點, 可以使用  chdir

操作符改變當前目錄:

chdir

"/etc

" or die

"can't chdir to /etc:$!

"; #因為這是乙個相對作業系統的呼叫, 所以錯誤資訊會返回到 $! 中.

由perl程式啟動的所有程序都會繼承perl程式的工作目錄. 但對於啟動perl的程序,它的工作目錄不會隨perl工作目錄的改變而改變, 所以無法寫出任何perl程式來代替shell裡的cd命令.因為一旦退出perl程式, 又會回到開始的工作目錄.

如果省略引數, 將回到使用者主目錄, 這是少數不以$_作為預設引數的情形之一.

2. 檔案通配名(globbing)

命令列裡: shell會將命令列裡的檔名模式展開成所有匹配的檔名, 稱為檔名通配, 如 echo *.txt  名令echo並不知道如何展開*txt, 因為shell會將它展開, 在perl中也同樣適用.

perl程式中: 適用 glob

操作符進行檔名通配.  my

@all_files = glob"*

"; #所有檔案

my@pm_files = glob

"*.pm

";glob 不會匹配以 . 號開頭的檔名, 任何能在命令列上鍵入的模式都能作為引數交給glob處理, 如果要一次匹配多種模式,可以在引數中用空格隔開各個模式:  my

@all_files_including_dot=glob

".* *

";在glob操作符之前的方式: 使用尖括號語法 my

@all_files=<*>;  和雙引號字串內插的情形類似, 尖括號內的變數也會被替換為當前變數的值, 然後按照檔名通配展開成對應的檔名列表.

my

$dir="

/etc";

my@dir_files=<$dir/* $dir/.*>;

聯想到表示從檔案控制代碼讀取, 那麼perl怎麼區分是檔名通配還是從檔案控制代碼讀取呢? => 規則: 如果尖括號內是滿足perl識別符號條件的,就作為檔案控制代碼讀取, 否則代表使用檔名通配操作.

my

@files = ; #

# glob

my@lines = ; #

# 從檔案控制代碼

my$name = "

fred";

my@files = <$name/*> #

# glob

my@files2 = <$name> #

# $name是簡單標量變數, 不是陣列或雜湊, 所以也是對檔案控制代碼的讀取,perl是在編譯時確定的, 所以和變數的內容無關

3. 目錄控制代碼

與檔案控制代碼類似, 只是操作符和內容不同

使用 opendir

代替檔案控制代碼操作符 open

使用 readdir

代替檔案控制代碼操作符  readline

使用 closedir

代替檔案控制代碼操作符  close

讀取到的是目錄裡的檔名和子目錄名 , 而不是檔案的內容.

my

$dir_to_process = "."

;opendir dh, $dir_to_process or die

"can't! $!\n";

foreach

$file(readdir

dh)closedir dh;

和檔案控制代碼一樣, 目錄控制代碼會在程式結束時自動關閉, 也會在用這個控制代碼再開啟另乙個目錄前自動關閉.

4.檔案操作

刪除:在perl中使用 unlink

操作符來將檔案放入碎紙機,類似於linux中的rm命令,引數是列表,返回成功地刪除了多少個檔案,可以配合萬用字元glob使用,實現一次刪除多個檔案。執行失敗時資訊儲存在變數 $!

重新命名: rename

函式,類似mv命令,引數為列表。執行失敗返回假,資訊儲存在$!中,通常使用 or die(或 or warn)來報告

5.建立和刪除目錄(每次只能操作乙個)

建立目錄 mkdir

,可以在建立目錄時指定許可權,如果許可權是字串,要用otc函式處理

my

$name = "

roger";

my$perssions = "

0755";

mkdir

$name , oct($perssions) or warn

"can't make directory $name : $!

";

刪除目錄 rmdir

,刪除非空目錄將會失敗。可以先用unlink刪除目錄裡面的目錄。建立臨時目錄最好包含當前程序識別符號,這個代號放在 $$ 變數中,這麼做什可以防止和別的程序衝突。

刪除目錄樹:使用模組 file::path

use file::path qw(make_path remove_tree);

#建立任意深度的目錄樹

# make_path($dir1,dir2,...)

make_path('

roger/bar/zoo

','rog/dsd');

make_path(

"roger/bar/zar

","roger/dst/r

",);

#刪除任意深度的目錄樹,如果目錄非空會先unlink檔案

remove_tree('

roger/bar/zar

','roger/dst/r

',);

修改檔案或目錄許可權: chmod

更改隸屬關係:  chown

修改時間戳: utime

:可以修改某個檔案的最近訪問時間來造假

Perl 學習筆記

在linux上,如果遇到這樣的提示 can t locate module datetime.pm in inc 意味著perl模組沒有安裝全,可以用cpan來安裝缺失的模組 perl mcpan e install module build 如果系統上很多模組都已經很舊了,用這個命令來自動更新 u...

perl 學習筆記

perl 語法 一 資料結構 標量 陣列 雜湊 0 八進位制 0x 十六進製制 注釋 二 字串 1 字元鏈結 2 單引號內字元不會被轉義 3 v字元 乙個以 v 開頭,後面跟著乙個或多個用句點分隔的整數,會被當作乙個字串文字。foo v102.111.111 4 here 文件 print 5 特殊...

Perl學習筆記

標量 陣列陣列是標量資料的有序列表,是多個標量資料的一種集合。可以包含任意多個元素,從0到全部佔滿記憶體。以 符號作為標識。1,2,3 包含1,2,3三個數字的列表 1,2,3 三個數字,最後逗號被省略 test 4.5 兩個值 空列表 零個元素 1 5 代表 1,2,3,4,5 5 1 空列表,從...