您好,登錄后才能下訂單哦!
這篇文章主要為大家展示了“Perl文件操作技巧有哪些”,內(nèi)容簡(jiǎn)而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領(lǐng)大家一起研究并學(xué)習(xí)一下“Perl文件操作技巧有哪些”這篇文章吧。
Perl文件操作技巧
Perl文件操作一:找到具有指定特征的文件
$path="/path/to/dir/"; opendirDIR,$path; @arr1=readdirDIR; @arr2=grep{-T"$path$_"}@arr1;#textfilesonly @arr3=grep{!-d"$path$_"}@arr1;#noDirectories @arr4=grep{-s"$path$_"<1024}@arr1;#lessthan1K
代碼解釋:假如被測(cè)試的目錄項(xiàng)是一個(gè)文本文件,那么-T文件操作符就會(huì)返回真。其實(shí)針對(duì)目錄項(xiàng)的測(cè)試操作還有很多。(注:文件和目錄在系統(tǒng)中都是以目錄項(xiàng)的形式來(lái)管理的,所以要區(qū)別一個(gè)目錄項(xiàng)指向的是一個(gè)文件還是一個(gè)目錄需要相應(yīng)的操作符)。注意上面的readdir函數(shù)返回指定目錄下的所有目錄項(xiàng)。因?yàn)樵趃rep函數(shù)中對(duì)目錄項(xiàng)的測(cè)試需要文件的完全路徑,所以我們把$PATH(存儲(chǔ)了目錄項(xiàng)的部分路徑)和$_(存儲(chǔ)了目錄項(xiàng)的名字)中的內(nèi)容聯(lián)合起來(lái)得到文件的完全路徑
Perl文件操作二:對(duì)目錄進(jìn)行遞歸搜索
useFile::Find; find(\&handleFind,'imac:documents:code'); subhandleFind{ my$foundFile=$File::Find::name; print"$foundFile\n"if($foundFile=~/\.html?$/i); }
RESULT:imac:documents:code:index.htmlimac:documents:code:perl:example.HTM運(yùn)行結(jié)果:代碼討論:那些工作于Unix系統(tǒng)的Perl程序員可以非常簡(jiǎn)便的利用UNIX上提供的工具來(lái)完成許多日常的工作,比如遞歸的列出指定目錄下的所有目錄項(xiàng)(也就是列出指定目錄及指定目錄子目錄下的所有目錄項(xiàng)目)。然而Perl的一個(gè)***的特征就是可以運(yùn)行于很多的平臺(tái)上。所以如果你碰巧工作在一個(gè)非UNIX的平臺(tái),或者如果你雖工作在UNIX平臺(tái),但不喜歡使用系統(tǒng)工具寫腳本,你可以選擇Perl。要完成這些巧妙的工作,你需要使用perl中的File:Find模塊。當(dāng)你加載了這個(gè)模塊的時(shí)候,你就可以使用其中的find子函數(shù),在調(diào)用這個(gè)函數(shù)的時(shí)候,需要帶參數(shù):***個(gè)參數(shù)是一個(gè)函數(shù)的引用,這個(gè)函數(shù)由你自己建立,每次一個(gè)文件被找到的時(shí)候,它都會(huì)運(yùn)行。接下來(lái)的一個(gè)參數(shù)是一串你想要搜索的路徑。我寫的這個(gè)示例腳本是運(yùn)行在MacintoshOS8.x系統(tǒng)上的,所以我使用了Mac系統(tǒng)的路徑分隔符:。如果是在Windows,你可以用反斜杠,如果是在Unix系統(tǒng)則是正斜杠(至于在Amiga系統(tǒng)上用什么我就不知道了)??傊?,find函數(shù)將會(huì)在每次找到一個(gè)文件的時(shí)候調(diào)用你給出的子函數(shù),而且會(huì)對(duì)子目錄進(jìn)行查找。在我的handledfind子函數(shù)中,我通過(guò)這個(gè)模塊特定變量$File::Find::name來(lái)獲得每次find找到的文件名。然后,就可以對(duì)該文件執(zhí)行任何你想的測(cè)試,在上面的例子中,我們輸出有.html的擴(kuò)展名文件名。
Perl文件操作三:文件讀操作---一次讀入整個(gè)文件內(nèi)容
openFH,"<anthem"; $/=undef; $slurp=; print$slurp;
運(yùn)行結(jié)果:一下就顯示了所有的文件內(nèi)容,此刻你應(yīng)該非常的自豪。:)代碼討論:尖括號(hào)<>對(duì)文件句柄進(jìn)行操作,在標(biāo)量上下文中它將返回文件的下一條記錄,在數(shù)組上下文中它將返回所有的記錄。在默認(rèn)的情況下,文件中的記錄被認(rèn)為是由換行符分開(kāi)(例如回車或其他代表新行開(kāi)始的字符)。你可以重新設(shè)定這個(gè)默認(rèn)的分隔符,然后Perl將會(huì)以你指定的分隔符為準(zhǔn)來(lái)替代換行符。全局變量$/里存儲(chǔ)了輸入文件的分隔符,如果你把$/的值設(shè)置為undef,那么Perl將會(huì)認(rèn)為整個(gè)文件是一條記錄(因?yàn)榇丝桃呀?jīng)沒(méi)有文件分隔符了)。牢記$/是全局變量,千萬(wàn)不要在腳本的其他地方不經(jīng)意的改變它,這個(gè)錯(cuò)誤將很難被發(fā)現(xiàn)。你可能會(huì)問(wèn),我們能否不改變$/,而采用把文件的所有記錄讀到一個(gè)數(shù)組中,然后把數(shù)組聯(lián)合成一個(gè)很長(zhǎng)的字符串(比如$slurp=join("",);)的方法實(shí)現(xiàn)一次讀入文件。當(dāng)然這也是一個(gè)有效的解決辦法,但是你會(huì)發(fā)現(xiàn)它很慢,是否選用它取決你的應(yīng)用,取決于你是否關(guān)心運(yùn)行速度。
Perl文件操作四:賦值---把一個(gè)文件句柄賦給另一個(gè)文件句柄
open(MYOUT,">bottle.txt");
*STDOUT=*MYOUT;print"message";運(yùn)行結(jié)果:文本文件bottle.txt現(xiàn)在包含message字符串。代碼討論:以前可能你配合使用過(guò)Print函數(shù)和文件句柄,但是你是否知道就算你沒(méi)有使用文件句柄,Perl也默認(rèn)你在使用一個(gè)稱為STDOUT的句柄?C程序員知道STDOUT代表標(biāo)準(zhǔn)輸出,也就是通常的屏幕,或終端窗口(或者是CGI程序的輸出端-瀏覽器)。在這里我們完成的工作是創(chuàng)建我們自己的文件句柄,它指向一個(gè)給定的文件,然后我們做了一件比較鬼的工作,使用*前綴把STDOUT轉(zhuǎn)換為typeglob類型。Typeglob類型的數(shù)據(jù)可以有別名,這樣一個(gè)變量可能會(huì)指向另一個(gè)其他名字的變量。上面第二行代碼使STDOUT指向MYOUT變量。所以執(zhí)行print操作時(shí)的默認(rèn)輸出對(duì)象也就成為了我們創(chuàng)建的文件句柄。
Perl文件操作五:同時(shí)向兩個(gè)文件句柄執(zhí)行寫操作
useIO::Tee;$tee=IO::Tee->new(">>debuglog.txt",\*STDOUT); print$tee"anerrorocurredon".scalar(localtime)."\n";
運(yùn)行結(jié)果:anerrorocurredonFriFeb2321:44:202001代碼討論:如果,由于種種原因你想要同時(shí)向兩個(gè)位置寫入同一個(gè)字符串,這和UNIX下的tee工具的用途一樣。即使你不是工作在Unix平臺(tái)上,Perl也通過(guò)Tee模塊為你提供這個(gè)功能。Tee模塊可以在CPAN下載,你應(yīng)該把它安裝到Perl的IO庫(kù)文件夾中。Tee模塊以O(shè)OP方式編寫,所以使用它之前你應(yīng)該首先使用它的new方法來(lái)創(chuàng)建一個(gè)Tee對(duì)象,整個(gè)過(guò)程需要兩個(gè)參數(shù),每個(gè)參數(shù)既可以是代表文件句柄的字符串,也可以是一個(gè)對(duì)已打開(kāi)的文件句柄的引用。在上面的例子中,我們用一個(gè)字符串來(lái)代表一個(gè)以附加模式打開(kāi)的文件句柄,它指向名為debuglog.txt的文件,另一個(gè)參數(shù)是系統(tǒng)內(nèi)置的文件句柄STDOUT,整個(gè)句柄是系統(tǒng)自動(dòng)創(chuàng)建的,print函數(shù)默認(rèn)情況對(duì)它進(jìn)行操作。為了得到一個(gè)文件句柄的引用我們需要對(duì)一個(gè)typeglob類型的數(shù)據(jù)使用反斜杠。Typeglob可以代表任何已命名的某個(gè)變量,不論它是數(shù)組,散列還是標(biāo)量等。使用*很有必要,因?yàn)槲募浔约簺](méi)有前綴符號(hào)。new操作符返回Tee類的一個(gè)實(shí)例對(duì)象,然后我們把整個(gè)實(shí)例賦給$tee標(biāo)量?,F(xiàn)在,無(wú)論什么時(shí)候我們向$tee進(jìn)行寫入操作,我們都同時(shí)向兩個(gè)位置進(jìn)行寫操作。
Perl文件操作六:更多文件操作--從一個(gè)文件的完全路徑中找出它的名字
useFile::Basename; $path="/docs/sitecircus.com/html/tricks/trick.of.the.week.html"; $basenamebasename=basename($path,".html"); print$basename;
運(yùn)行結(jié)果:trick.of.the.week代碼討論:好了,成功了。問(wèn)題是要找出文件的名字,要不帶任何路徑前綴,不帶任何擴(kuò)展名。File::Basename模塊可以使這很容易實(shí)現(xiàn),我們只需要把文件的完全路徑還有要剔除的擴(kuò)展名傳給它。上面的path變量是文件的完全路徑,注意文件分隔符是/,這個(gè)字符很特殊,因?yàn)樗遣僮飨到y(tǒng)的保留字符。這里你不能在文件名里使用系統(tǒng)的分隔符。你應(yīng)該知道當(dāng)今流行的操作系統(tǒng)都使用自己獨(dú)特的文件分隔符:Unix使用/,Windows使用\,Macintosh使用:(順便說(shuō)一下,在Windows上的Perl腳本中,你既可以使用\也可以使用/作為文件分隔符,Perl的解釋器能理解你的意思)。File::Basename,當(dāng)然,能正確在完全路徑中找到文件名,不論時(shí)在什么系統(tǒng)下。
Perl文件操作七:改變文件的所有者
($uid,$gid)=(getpwnam($username))[2,3] ordie"$usernotinpasswdfile"; chown($uid,$gid,$file) orwarn"couldn'tchown$file.";
運(yùn)行結(jié)果:無(wú)輸出代碼討論:有的時(shí)候,你可能知道一個(gè)用戶名,而你想用這個(gè)用戶名做些事,比如改變一個(gè)文件的所有者。但是不幸的是,Perl的chown命令不能接受用戶名作為參數(shù),但是可以接受一對(duì)數(shù)字:userid和groupid。雖然有這些不便之處,Perl并沒(méi)有讓我們陷入困境,我們可以把用戶名作為getpwnam函數(shù)的參數(shù),獲得一個(gè)數(shù)組,里面包含了用戶名對(duì)應(yīng)的userid和groupid,分別對(duì)應(yīng)著數(shù)組里的第二和第三個(gè)元素。
以上是“Perl文件操作技巧有哪些”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內(nèi)容對(duì)大家有所幫助,如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。