日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

perl学习笔记——目录操作

發布時間:2023/12/9 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 perl学习笔记——目录操作 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

在目錄書中移動

chdir?操作副改變當前的工作目錄。它和shellcd命令類似:

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学习笔记——目录操作的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。