自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Perl文件操作七大技巧揭秘

開發(fā) 架構(gòu)
你對Perl語言中Perl文件操作的方法是否比較明確,這里向大家簡單介紹幾種Perl文件操作的技巧,希望本文的介紹能讓你有所收獲。

本文和大家重點學(xué)習(xí)一下幾種Perl文件操作技巧,主要從七個方面來向大家介紹,相信通過本文的學(xué)習(xí)你對Perl文件操作的方法有深刻的認識。

Perl文件操作技巧

Perl文件操作一:找到具有指定特征的文件  

  1. $path="/path/to/dir/";  
  2.   opendirDIR,$path;  
  3.   @arr1=readdirDIR;  
  4.   @arr2=grep{-T"$path$_"}@arr1;#textfilesonly  
  5.   @arr3=grep{!-d"$path$_"}@arr1;#noDirectories  
  6.   @arr4=grep{-s"$path$_"<1024}@arr1;#lessthan1K  

   代碼解釋:假如被測試的目錄項是一個文本文件,那么-T文件操作符就會返回真。其實針對目錄項的測試操作還有很多。(注:文件和目錄在系統(tǒng)中都是以目錄項的形式來管理的,所以要區(qū)別一個目錄項指向的是一個文件還是一個目錄需要相應(yīng)的操作符)。注意上面的readdir函數(shù)返回指定目錄下的所有目錄項。因為在grep函數(shù)中對目錄項的測試需要文件的完全路徑,所以我們把$PATH(存儲了目錄項的部分路徑)和$_(存儲了目錄項的名字)中的內(nèi)容聯(lián)合起來得到文件的完全路徑

  Perl文件操作二:對目錄進行遞歸搜索  

  1. useFile::Find;  
  2.   find(\&handleFind,'imac:documents:code');  
  3.   subhandleFind{  
  4.   my$foundFile=$File::Find::name;  
  5.   print"$foundFile\n"if($foundFile=~/\.html?$/i);  
  6.   }  

   RESULT:imac:documents:code:index.htmlimac:documents:code:perl:example.HTM運行結(jié)果:代碼討論:那些工作于Unix系統(tǒng)的Perl程序員可以非常簡便的利用UNIX上提供的工具來完成許多日常的工作,比如遞歸的列出指定目錄下的所有目錄項(也就是列出指定目錄及指定目錄子目錄下的所有目錄項目)。然而Perl的一個***的特征就是可以運行于很多的平臺上。所以如果你碰巧工作在一個非UNIX的平臺,或者如果你雖工作在UNIX平臺,但不喜歡使用系統(tǒng)工具寫腳本,你可以選擇Perl。要完成這些巧妙的工作,你需要使用perl中的File:Find模塊。當(dāng)你加載了這個模塊的時候,你就可以使用其中的find子函數(shù),在調(diào)用這個函數(shù)的時候,需要帶參數(shù):***個參數(shù)是一個函數(shù)的引用,這個函數(shù)由你自己建立,每次一個文件被找到的時候,它都會運行。接下來的一個參數(shù)是一串你想要搜索的路徑。我寫的這個示例腳本是運行在MacintoshOS8.x系統(tǒng)上的,所以我使用了Mac系統(tǒng)的路徑分隔符:。如果是在Windows,你可以用反斜杠,如果是在Unix系統(tǒng)則是正斜杠(至于在Amiga系統(tǒng)上用什么我就不知道了)??傊?,find函數(shù)將會在每次找到一個文件的時候調(diào)用你給出的子函數(shù),而且會對子目錄進行查找。在我的handledfind子函數(shù)中,我通過這個模塊特定變量$File::Find::name來獲得每次find找到的文件名。然后,就可以對該文件執(zhí)行任何你想的測試,在上面的例子中,我們輸出有.html的擴展名文件名。

  Perl文件操作三:文件讀操作---一次讀入整個文件內(nèi)容 

  1. openFH,"<anthem";  
  2. $/=undef;  
  3. $slurp=;  
  4. print$slurp; 

   運行結(jié)果:一下就顯示了所有的文件內(nèi)容,此刻你應(yīng)該非常的自豪。:)代碼討論:尖括號<>對文件句柄進行操作,在標(biāo)量上下文中它將返回文件的下一條記錄,在數(shù)組上下文中它將返回所有的記錄。在默認的情況下,文件中的記錄被認為是由換行符分開(例如回車或其他代表新行開始的字符)。你可以重新設(shè)定這個默認的分隔符,然后Perl將會以你指定的分隔符為準(zhǔn)來替代換行符。全局變量$/里存儲了輸入文件的分隔符,如果你把$/的值設(shè)置為undef,那么Perl將會認為整個文件是一條記錄(因為此刻已經(jīng)沒有文件分隔符了)。牢記$/是全局變量,千萬不要在腳本的其他地方不經(jīng)意的改變它,這個錯誤將很難被發(fā)現(xiàn)。你可能會問,我們能否不改變$/,而采用把文件的所有記錄讀到一個數(shù)組中,然后把數(shù)組聯(lián)合成一個很長的字符串(比如$slurp=join("",);)的方法實現(xiàn)一次讀入文件。當(dāng)然這也是一個有效的解決辦法,但是你會發(fā)現(xiàn)它很慢,是否選用它取決你的應(yīng)用,取決于你是否關(guān)心運行速度。

  Perl文件操作四:賦值---把一個文件句柄賦給另一個文件句柄

  open(MYOUT,">bottle.txt");

 *STDOUT=*MYOUT;print"message";運行結(jié)果:文本文件bottle.txt現(xiàn)在包含message字符串。代碼討論:以前可能你配合使用過Print函數(shù)和文件句柄,但是你是否知道就算你沒有使用文件句柄,Perl也默認你在使用一個稱為STDOUT的句柄?C程序員知道STDOUT代表標(biāo)準(zhǔn)輸出,也就是通常的屏幕,或終端窗口(或者是CGI程序的輸出端-瀏覽器)。在這里我們完成的工作是創(chuàng)建我們自己的文件句柄,它指向一個給定的文件,然后我們做了一件比較鬼的工作,使用*前綴把STDOUT轉(zhuǎn)換為typeglob類型。Typeglob類型的數(shù)據(jù)可以有別名,這樣一個變量可能會指向另一個其他名字的變量。上面第二行代碼使STDOUT指向MYOUT變量。所以執(zhí)行print操作時的默認輸出對象也就成為了我們創(chuàng)建的文件句柄。

  Perl文件操作五:同時向兩個文件句柄執(zhí)行寫操作 

  1. useIO::Tee;$tee=IO::Tee->new(">>debuglog.txt",\*STDOUT);  
  2. print$tee"anerrorocurredon".scalar(localtime)."\n";  
  3.  

   運行結(jié)果:anerrorocurredonFriFeb2321:44:202001代碼討論:如果,由于種種原因你想要同時向兩個位置寫入同一個字符串,這和UNIX下的tee工具的用途一樣。即使你不是工作在Unix平臺上,Perl也通過Tee模塊為你提供這個功能。Tee模塊可以在CPAN下載,你應(yīng)該把它安裝到Perl的IO庫文件夾中。Tee模塊以O(shè)OP方式編寫,所以使用它之前你應(yīng)該首先使用它的new方法來創(chuàng)建一個Tee對象,整個過程需要兩個參數(shù),每個參數(shù)既可以是代表文件句柄的字符串,也可以是一個對已打開的文件句柄的引用。在上面的例子中,我們用一個字符串來代表一個以附加模式打開的文件句柄,它指向名為debuglog.txt的文件,另一個參數(shù)是系統(tǒng)內(nèi)置的文件句柄STDOUT,整個句柄是系統(tǒng)自動創(chuàng)建的,print函數(shù)默認情況對它進行操作。為了得到一個文件句柄的引用我們需要對一個typeglob類型的數(shù)據(jù)使用反斜杠。Typeglob可以代表任何已命名的某個變量,不論它是數(shù)組,散列還是標(biāo)量等。使用*很有必要,因為文件句柄自己沒有前綴符號。new操作符返回Tee類的一個實例對象,然后我們把整個實例賦給$tee標(biāo)量?,F(xiàn)在,無論什么時候我們向$tee進行寫入操作,我們都同時向兩個位置進行寫操作。

  Perl文件操作六:更多文件操作--從一個文件的完全路徑中找出它的名字 

  1. useFile::Basename; $path="/docs/sitecircus.com/html/tricks/trick.of.the.week.html";  
  2. $basenamebasename=basename($path,".html");  
  3. print$basename;  

   運行結(jié)果:trick.of.the.week代碼討論:好了,成功了。問題是要找出文件的名字,要不帶任何路徑前綴,不帶任何擴展名。File::Basename模塊可以使這很容易實現(xiàn),我們只需要把文件的完全路徑還有要剔除的擴展名傳給它。上面的path變量是文件的完全路徑,注意文件分隔符是/,這個字符很特殊,因為它是操作系統(tǒng)的保留字符。這里你不能在文件名里使用系統(tǒng)的分隔符。你應(yīng)該知道當(dāng)今流行的操作系統(tǒng)都使用自己獨特的文件分隔符:Unix使用/,Windows使用\,Macintosh使用:(順便說一下,在Windows上的Perl腳本中,你既可以使用\也可以使用/作為文件分隔符,Perl的解釋器能理解你的意思)。File::Basename,當(dāng)然,能正確在完全路徑中找到文件名,不論時在什么系統(tǒng)下。

  Perl文件操作七:改變文件的所有者   

  1. ($uid,$gid)=(getpwnam($username))[2,3]  
  2.   ordie"$usernotinpasswdfile";  
  3.   chown($uid,$gid,$file)  
  4.   orwarn"couldn'tchown$file."; 

   運行結(jié)果:無輸出代碼討論:有的時候,你可能知道一個用戶名,而你想用這個用戶名做些事,比如改變一個文件的所有者。但是不幸的是,Perl的chown命令不能接受用戶名作為參數(shù),但是可以接受一對數(shù)字:userid和groupid。雖然有這些不便之處,Perl并沒有讓我們陷入困境,我們可以把用戶名作為getpwnam函數(shù)的參數(shù),獲得一個數(shù)組,里面包含了用戶名對應(yīng)的userid和groupid,分別對應(yīng)著數(shù)組里的第二和第三個元素。

【編輯推薦】

  1. Perl文件讀寫方法詳解 
  2. Perl文件句柄概念詳解
  3. 解析Perl文件系統(tǒng)應(yīng)用中函數(shù)的語法
  4. Perl目錄句柄基本操作解析
  5. 深入學(xué)習(xí)Perl文件系統(tǒng)用法

 

責(zé)任編輯:佚名 來源: csdn.net
相關(guān)推薦

2011-07-05 14:19:02

云備份云計算

2020-09-01 07:22:04

網(wǎng)絡(luò)戰(zhàn)武器系統(tǒng)網(wǎng)絡(luò)安全

2023-02-21 14:55:40

React開發(fā)技巧

2017-09-04 18:02:58

應(yīng)用程序APP移動設(shè)備

2013-04-22 11:13:06

程序員編程誤區(qū)

2021-11-30 06:31:06

勒索軟件攻擊網(wǎng)絡(luò)安全

2010-03-29 09:03:44

Windows Pho

2018-02-28 10:11:22

UPS電源預(yù)防

2024-06-12 11:47:38

2022-07-04 09:07:23

技術(shù)架構(gòu)管理

2018-09-10 06:00:12

2009-12-01 14:35:06

Linux忠告

2010-07-20 14:27:46

Perl命令行

2015-07-08 08:51:11

SDN

2010-08-09 14:37:00

認證證書

2012-08-06 10:51:40

JavaScript

2015-03-20 15:34:35

戴爾云計算DELL

2020-12-22 09:55:55

IT首席信息官CIO

2022-05-23 08:09:42

物聯(lián)網(wǎng)IOT

2020-12-18 10:35:27

IT技術(shù)領(lǐng)導(dǎo)者
點贊
收藏

51CTO技術(shù)棧公眾號