我的整個 perl 腳本試圖按如下方式操作:
- 讀取源檔案的內容
- 查找正則運算式匹配并將該匹配用于目標檔案名
- 打開新的目標檔案名
- 查找包含關鍵字的 C 格式注釋 /* */ 的正則運算式匹配,即 abcd
- 將找到的字串匹配寫入目標檔案名
#!/usr/bin/perl
use warnings;
use strict;
my $src = 'D:\\Scripts\\sample.c';
my $fileName;
# open source file for reading
open(SRC,'<',$src) or die $!;
while(my $row = <SRC>){
if ($row =~ /([0-9]{2}\.[0-9]{2}\.[0-9]{3}\.[a-z,0-9]{2}|[0-9]{2}\.[0-9]{2}\.[0-9]{3}\.[a-z,0-9]{3})/){
$fileName = $1;
}
}
my $des = "D:\\Scripts\\" . $fileName . ".txt";
# open destination file for writing
open(DES,'>',$des) or die $!;
print("copying content from $src to $des\n");
while(my $row = <SRC>){
if ($row =~ /(\/\*.*abcd.[\s\S]*?\*\/)/){
print DES $1;
}
}
# always close the filehandles
close(SRC);
close(DES);
print "File content copied successfully!\n";
我正在使用 Perl 5.32.1 在 Windows 10 命令列中運行它。我的問題是我沒有將任何內容寫入目標檔案。該檔案被創建,但沒有內容被寫入其中。當我改變時:
print DES $1; -> print "$1\n";
我也沒有從命令列視窗中得到任何內容。當我將整個第二個 if 陳述句移動到第一個 if 陳述句之后的第一個 while 回圈下方時,我得到了命令列的輸出。但是我不能在那里保留第二個 if 陳述句,因為我希望它寫入目標檔案。
uj5u.com熱心網友回復:
在檔案句柄$src第一次到達檔案末尾時讀取檔案。SRC因此,當您嘗試再次讀取檔案時,該檔案句柄上沒有可讀取的內容(它不會告訴您)。
第一次讀取完成后,將檔案句柄重新定位到檔案的開頭
seek SRC, 0, 0;
有很好的符號常量可以與seek一起使用,請參閱Fcntl
另一種選擇是關閉并再次打開檔案。(或者甚至只是重新打開它的相同檔案句柄,在這種情況下它首先被關閉。)
注意:使用詞法檔案句柄比使用型別球更好,例如
open my $src_fh, '<', $src_file or die $!;
在 perldata 中查看關于它的評論,并搜索 SO 帖子(例如,這里是一個)。
uj5u.com熱心網友回復:
我會稍微改變一下問題。與其讀取檔案兩次,不如讀取一次。寫入名稱不重要的臨時檔案。一路上,發現最終的檔案名。完成后,重命名臨時檔案。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464657.html
下一篇:從perl呼叫和控制GDB
