**:
在寫指令碼處理檔案系統時,經常需要載入很多模組。其中好多有用函式分散在各種不同的模組中。它們有些是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 目的是指挑戰或一系列你的大資料戰略所定義的挑戰。...