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 空列表,從...