10 Perl5中19個最重要的檔案系統工具

2022-08-09 15:15:21 字數 3048 閱讀 7996

**:

在寫指令碼處理檔案系統時,經常需要載入很多模組。其中好多有用函式分散在各種不同的模組中。它們有些是perl的內建函式,有些是在同perl一起發行的標準模組中,另外一些是通過cpan安裝的。

下面來看15個最常用的工具。

我經常需要知道當前所在的資料夾是什麼。cwd 模組有乙個同名但是小寫的函式 cwd,它會返回當前工作目錄。

usestrict;

usewarnings;

usecwdqw(cwd);

printcwd,"\n";

我經常需要建立一批臨時檔案,並且確保它們在指令碼結束的時候會被自動刪除。要滿足這個需求,最簡單的方法是以 cleanup 選項使用 file::temp 模組的 tempdir 函式來建立乙個臨時資料夾。

usestrict;

usewarnings;

useautodie;

usefile::tempqw(tempdir);

my$dir =tempdir(cleanup =>1);

print"$dir\n";

open my$fh,'>',"$dir/some_file.txt";

print$fh "text";

close $fh;

如果上面的**要在 linux 和 windows 上都要執行,人們會習慣在 windows 平台上用反斜線分割路徑。否則,在vms上不能執行。而這就是 file::spec::functions模組中catfile函式的用武之地。

usestrict;

usewarnings;

usefile::spec::functionsqw(catfile);

usefile::tempqw(tempdir);

my$dir =tempdir(cleanup =>1);

print"$dir\n";

printcatfile($dir,'some_file.txt'),"\n";

執行這個**後,能看到臨時資料夾被列印出來,緊跟其後的是檔案名字。

通常情況下,先切換工作目錄到臨時資料夾再進行操作會更簡單。但是也存在其他情況的寫測試。此時我們可以使用內建函式chdir。

usestrict;

usewarnings;

useautodie;

usefile::tempqw(tempdir);

usecwd;

my$dir =tempdir(cleanup =>1);

printcwd,"\n";

chdir $dir;

printcwd,"\n";

open my$fh,'>','temp.txt';

print$fh,'text';

close $fh;

以上看起來可以正常工作,但是當file::temp嘗試刪除資料夾,而我們仍然「在裡面」(之前切換工作目錄到它)時就會有問題。

例如,我會得到下面的錯誤資訊:

cannot remove path when cwd is /tmp/p3dzp_rmqg for /tmp/p3dzp_rmqg:
為了避免這種情況,我通常會在切換目錄之前儲存cwd的返回值,並且在最後再次呼叫chdir。

my$original =cwd;

...chdir $original;

這樣仍然會有個小問題。如果我在指令碼中間呼叫exit(),或者在執行到chdir $original之前丟擲異常而終止指令碼,會發生什麼?

perl提供了乙個解決方案:把最後乙個chdir包裹在end塊中。如此,就會確保無論何時、以何種方式退出指令碼,這些**都會執行到。

my$original =cwd;

...end

當寫乙個多檔案構成的專案(例如乙個或多個指令碼,多個模組,也可能是多個模板),並且我不想「安裝」它們時,最好的目錄組織方式是:確保每個檔案都在乙個固定的相對位置。

所以,我的專案目錄通常會包含乙個指令碼子資料夾,乙個模組資料夾(lib), 乙個模板資料夾, 等等:

project/

scripts/

lib/

templates/

那麼,如何才能確保指令碼能夠找到模板? 我有好幾個處理辦法:

usestrict;

usewarnings;

useautodie;

usefindbinqw($bin);

usefile::basenameqw(dirname);

usefile::spec::functionsqw(catdir);

print$bin,"\n";# /home/foobar/rocket-launcher/scripts

printdirname($bin),"\n";# /home/foobar/rocket-launcher

printcatdir(dirname($bin),'templates'),"\n";# /home/foobar/rocket-launcher/templates

findbin模組匯出的參量$bin存放著當前指令碼的目錄路徑。 在我們的例子中就是指向project/scripts/資料夾的路徑。

file::basename中的dirname函式會傳入乙個路徑,並返回除最後一部分之外的路徑。

最後一行file::spec::functions模組的catdir函式基本上和我們之前看到的catfile一樣。

除了列印到螢幕上,當然也可以使用catdir的返回值來表示templates路徑。

大部分情況下,要查詢和載入的模組都會在專案的lib/資料夾中。為此,我們會把之前的**和lib指令連用。這樣會改變@inc變數的值,把相對路徑新增在陣列開頭。

usestrict;

usewarnings;

useautodie;

usefindbinqw($bin);

usefile::basenameqw(dirname);

usefile::spec::functionsqw(catdir);

uselib catdir(dirname($bin),'lib');

userocket::launcher;

假定存在lib/rocket/launcher.pm檔案

oracle10g中的5個服務的作用

1.oracledbconsoleorcl oem控制台的服務程序 可以以網頁形式進行db管理,比如 http localhost 1158 em 再以sys登陸,就可以管理db了 2.oraclejobschedulerorcl 定時器的服務程序 3.oracleoradb10g home1isq...

Oracle10g中的5個服務的作用

1.oracledbconsoleorcloem控制台的服務程序 可以以網頁形式進行db管理,比如 http localhost 1158 em 再以sys登陸,就可以管理db了 2.oraclejobschedulerorcl定時器的服務程序 3.oracleoradb10g home1isql ...

資料科學中的五個重要方面(5 P s)

資料科學是關於如何從資料中提取知識。我們定義資料科學作為乙個交叉學科,集合了人,處理過程,計算和大資料平台,特定於應用程式的目的和可程式設計性。產生資料本身的 和方式同樣很重要,但我們首先定義五個p,資料科學活動中的重要組成部分。目的 purpose 目的是指挑戰或一系列你的大資料戰略所定義的挑戰。...