perl学习笔记——目录操作
在目錄書中移動
chdir?操作副改變當前的工作目錄。它和shell中cd命令類似:
chdir?‘/etc’?or?die?“cannot?chdir?to?/etc:$1”;
注意:工作目錄不能更改的,也就是說Perl程序返回后一定會回到所在的工作目錄。
如果調用chdir時不加參數,Perl會猜想是想要回到用戶主目錄,并將工作目錄設成主目錄,這和shell下使用不加參數的cd命令效果相同。
注意:可不能使用波浪符~。
文件名通配
形如:echo?*.pm;其中通配符是*。在Perl中同樣適用:
my?@all_files=glob?‘*’;
My?@pm_files=glob?‘*.pm’;
其中,@all_files取得當前目錄中的所有文件并且按照字母順序排序,但不包括以點號開頭的文件,這和shell中的做法完全相同(ls)。
如果需要一次匹配多種模式,可以在參數中用空格隔開各個模式:
my all_files_including_dot=glob '*.gz *.pl';
文件通配的另一種語法
使用<>完成glob的功能,如:
my?@all_files=<*>;#效果等同于:?my?@all_files=glob?“*”;
?
Perl會把尖括號<>內出現的變量替換為他的值,類似與雙引號內字符串的變量內插。
?
my $dir='/etc';
?
my @dir_files=<$dir/* $dir/.*>;
假如尖括號即表示從文件句柄中讀取有代表文件名通配操作,那Perl如何取舍?
因為合理的文件句柄必須是嚴格意義上的Perl標識符,所以如果尖括號內滿足Perl標識符條件的,就作為文件句柄來讀取;否則就代表文件名通配符。如:
?
上述規則唯一例外就是當尖括號內僅僅是一個簡單的標量變量時,那么他就是間接文件句柄讀取,其中變量的值就是帶讀取的文件句柄名稱。
?
目錄句柄
opendir(代替open) 打開目錄句柄;
readdir (代替readline)讀取目錄句柄的內容;
closedir(代替close) 關閉目錄句柄;
對比:
#!/usr/bin/env perl use 5.010; open AA,'<','aa'; while(1){my $line=readline AA;if($line eq ""){last;#不知道為什么,用break出現了錯誤。}print "$line"; } close AA;?
?目錄句柄的缺點:目錄句柄返回的名稱列表并未按照特定的順序排列。同時列表中將包含所有文件,而不是匹配某些模式的部分(如:*.pm)。同時列表中包含了名稱一點號開頭的文件,.和..也在其中。所以如果我們只想處理名稱以pm結尾的文件,則可以在玄幻內使用一個跳過函數:
while($name=readdir $dh){
next unless $name=~ /\.pm$/; #處理名稱以pm結尾的文件
next if $name =~ /^\./;#去掉以點號開頭的文件
.....其他對文件名的處理......
}
因為readdir操作符返回的只是文件名并不包含路徑名,所以他們只是目錄里的文件名而已。
而有時候為了更加方便操作,也是更加清晰,使用下面的操作:
遞歸訪問目錄(主要為了實現shell中的find命令操作)
使用File::find模塊。
使用File::Find::Rule和File::Finder操作具有更好的用戶界面和可操作姓。
File::Find::Rule==>http://search.cpan.org/~rclamp/File-Find-Rule-0.33/lib/File/Find/Rule.pm;
如:
#!/usr/bin/env perl use 5.010; use File::Find::Rule; #say "INC==@INC"; @DIR=qw (/home/lukexwang/PerlDemo); use lib '.'; my @files=File::Find::Rule->file() ->name( '*.pl' ) ->in(@DIR); say "@files";?文件和目錄的操作
刪除文件:unlink?
unlink 'slate','bedrock','lava';
unlink qw(slate bedrock lava);
聯合glob函數和unlink函數:
unlink glob '*.o';==rm *.o;
unlink的返回值代表成功刪除的文件數目。
只知道數目并不知道具體是刪除了哪一個,如果一定要知道是刪除了哪一個可以遞歸刪除,如下面的語句:
這個命令只能刪除文件,不能刪除目錄(rmdir).
重命名文件
rename 'old','new';====>shell中的mv 命令
既然和mv類似,那當然可以將文件移動到其他的目錄下:
很多人喜歡用胖箭頭:
新聞組中最常見的就是以.old結尾的文件改名為.new結尾。下面是代碼:
鏈接和文件
硬鏈接:link 'chicken','egg' or warn "can't link chicken to egg:$!";#為egg創建連接chicken
軟鏈接:symlink 'dodgson','carroll' or warn "can't symlink dodgson to carroll:$!";
要取得軟鏈接指向的位置,使用readlink函數。他會指向軟連接的位置,如果參數不是符號連接,則返回undef;
創建和刪除目錄
mkdir 'fred',0755 or warn "Cannot make fred directory:$!";#fred為名字,0775為權限
注意不要漏了開頭的0(代表八進制),否則就是10進制的755,這等于八進制的1363。
注意下面的用法:
系統會把0755當作十進制來處理,所以相當于我們用01363權限創建了一個目錄;
所以需要使用oct函數,他能強行把字符串當作八進制處理,無論其是否以0開頭:
?
刪除目錄:rmdir函數,用法類似于unlink函數。但是每次只能刪除一個目錄。
注意:對于非空目錄調用rmdir函數會導致失敗。所以可以先用unlink刪除目錄中的內容,在試著移除已經清空的目錄。
這個方法并不是很好,如果是兩層以上的目錄,刪除就必須用遞歸了。具體還不太懂,等著補充!!!
$$是進程代號。
修改權限
chmod 0755,'fred','barney';
但是不能用:+x 或者go=u-w等參數。
修改隸屬關系
chown函數修改一系列文件的擁有者及其所屬組。擁有者和所屬組會被同時修改,并且指定時必須給出數字形式的用戶標識符和組標識符。如:
?
如果要處理的不是數字,而是想merlyn這樣的字符串呢?該如何,使用getpwnam函數將用戶名轉換成用戶編號,再使用getgrnam函數把用戶組名轉換成組編號:
?
轉載于:https://www.cnblogs.com/lukexwang/p/4679214.html
總結
以上是生活随笔為你收集整理的perl学习笔记——目录操作的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: wikioi 1034 家 实时动态的网
- 下一篇: unity的依赖注入