標籤:
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/.*>;
聯想到<STDIN>表示從檔案控制代碼讀取, 那麼Perl怎麼區分是檔案名稱通配還是從檔案控制代碼讀取呢? => 規則: 如果角括弧內是滿足Perl標識符條件的,就作為檔案控制代碼讀取, 否則代表使用檔案名稱通配操作.
my @files = <FRED/*>; ## globmy @lines = <FRED>; ## 從檔案控制代碼my $name = "FRED";my @files = <$name/*> ## globmy @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){ print "$file\n";}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",{ #實際過程中是一層一層建立的 verbose => 1, error => \my $roger, #為什麼要使用反斜線 mode => 0711, });# 刪除任意深度的分類樹,如果目錄非空會先unlink檔案remove_tree(‘roger/bar/zar‘,‘roger/dst/r‘,{ verbose => 1, error => \my $err_list, });
修改檔案或目錄許可權: chmod
更改隸屬關係: chown
修改時間戳記: utime :可以修改某個檔案的最近訪問時間來造假
Perl 學習筆記-目標操作