標籤:style blog color 使用 ar for strong 檔案 sp
今天做一份東西需要對一些檔案特定的欄位進行修改,其實這改一下很方便,甚至不需要去寫一個指令碼,但是為了方便使用,同時也是鞏固一下perl的知識,便寫了這個小指令碼。
但在寫的過程中還是碰到了幾個小問題,首先是perl目錄切換的問題,我在目前的目錄readdir、opendir一個目錄,並獲得檔案名稱以後,需要將這些檔案開啟處理,但是開啟這些檔案必然需要一個絕對路徑或者是相對路徑,所以導致直接開啟這些檔案會提示檔案不存在的錯誤,當然開啟檔案的時候使用了open .... or warn "can not open file : $!";這樣的處理。所以這個時候我採用了拼接一個目錄的方法。
1 foreach my $myFile (readdir SCNDIR) { 2 my $localFile; 3 if ($scnDir =~ /\/$/) { 4 $localFile = $scnDir . $myFile; 5 } else { 6 $localFile = $scnDir . ‘/‘ . $myFile; 7 } 8 if (-f $localFile) { 9 editFileWord ($localFile);10 }11 }
其中$scnDir = $ARGV[0] 接收的,這裡對$scnDir 做了一個判斷,判斷末尾是否加入了“/"符號。
這樣就能解決檔案路徑的問題。
然後在匹配的時候發現自己犯了一個很大的錯誤。
就是通常使用open直接開啟檔案,然後就用while (<FILE>)的方式接收檔案的每一句了,其中FILE是檔案控制代碼。
然後對就收的到每一句進行匹配
$lines =~ s/$editWord/$editedWord/g
s表示搜尋,g表示匹配所有,整句就標題把所有的$editWord替換成$editedWord
寫完以後運行,查看檔案,發現檔案沒有發生任何更改,想了一會發現自己真是蠢到家了。
$lines接收到了檔案中讀取的句子,但是我替換完以後並未將重新寫回到檔案中,開始想用seek的方法去寫,發現如果替換的長短不一樣,可能會造成一點問題。
也想過直接寫入到一個新的檔案,然後進行覆蓋,不過終究感覺有點麻煩,然後搜了一個cpan,找到一個好模組
Tie::File
Tie::File - Access the lines of a disk file via a Perl array
用這個可以非常便捷地修改檔案,方法如下:
sub editFileWord { my $file = shift; my $existWord = 0; tie my @arrayLines, ‘Tie::File‘, $file or die "can not open file : $!"; for (@arrayLines) { if (s/$editWord/$editedWord/g) { $existWord = 1; } } if ($existWord) { print $file . "\n"; }}
這樣就完成了欄位的替換,很簡單的一個小程式,但是卻存在著不少的小問題。
Tie對檔案的處理還是有神奇的作用的,有心的朋友可以去關注一下。
對perl還在摸索中,願各位大神能留下寶貴的意見。
perl對欄位替換的小問題