2015-03-13 41 views
0

我已經編寫代碼,但它不能正常工作。我希望將此「/」更改爲此「\」。如何更新perl文本文件的某些部分

use strict; 
use warnings; 

open(DATA,"+<unix_url.txt") or die("could not open file!"); 

while(<DATA>){ 

s/\//\\/g; 
s/\\/c:/; 
print DATA $_; 

} 

close(DATA); 

我的原始文件

/etc/passwd 
/home/bob/bookmarks.xml 
/home/bob/vimrc 

預期輸出是

C:\etc\passwd 
C:\home\bob\bookmarks.xml 
C:\home\bob\vimrc 

原始輸出

/etc/passwd 
/home/bob/bookmarks.xml 
/home/bob/vimrc/etc/passwd 
\etc\passwd 
kmarks.xml 
kmarks.xml 
mrcmrc 

回答

1

試圖讀寫在一個while循環中,一行一行地讀取同一個文件直到該文件結束,看起來非常危險且不可預知。我一點也不確定你的文件指針會在你每次寫入時結束。你會更安全地將你的輸出發送到一個新的文件(然後如果你願意,然後移動它來替換你的舊文件)。

open(DATA,"<unix_url.txt") or die("could not open file for reading!"); 
open(NEWDATA, ">win_url.txt") or die ("could not open file for writing!"); 

while(<DATA>){ 
    s/\//\\/g; 
    s/\\/c:\\/; 
    #  ^(note - from your expected output you also wanted to preserve this backslash) 
    print NEWDATA $_; 
} 

close(DATA); 
close(NEWDATA); 
rename("win_url.txt", "unix_url.txt"); 

參見此答案: Perl Read/Write File Handle - Unable to Overwrite

0

你並不真的需要寫一個程序就實現這個。您可以使用Perl派:

perl -pi -e 's|/|\\|g; s|\\|c:\\|;' unix_url.txt 

但是,如果你在Windows上運行,你使用Cygwin,我會建議使用cygpath工具轉換POSIX路徑到Windows路徑。

此外,您還需要引用您的路徑,因爲它允許在windows路徑中有空格。或者,你可以擺脫空間字符:

perl -pi -e 's|/|\\/g; s|\\|c:\\|; s| |\\ |g;' unix_url.txt 

現在關於您最初的問題,如果你仍然想使用自己的腳本,你可以使用這個(如果你想備份):

use strict; 
use autodie; 
use File::Copy; 

my $file = "unix_url.txt"; 
open my $fh, "<", $file; 
open my $tmp, ">", "$file.bak"; 
while (<$fh>) { 
    s/\//\\/g; 
    s/\\/c:/; 
} continue { print $tmp $_ } 
close $tmp; 
close $fh; 
move "$file.bak", $file; 
+6

艇員選拔不同的字符防止傾斜牙籤綜合症:'S =/= \\ =克;' – choroba 2015-03-13 09:51:21

1

如果練習的要點是少談使用正則表達式,並詳細瞭解做事情,我會考慮使用從File::Spec系列模塊:

use warnings; 
use strict; 
use File::Spec::Win32; 
use File::Spec::Unix; 
while (my $unixpath = <>) { 
    my @pieces = File::Spec::Unix->splitpath($unixpath); 
    my $winpath = File::Spec::Win32->catfile('c:', @pieces); 
    print "$winpath\n"; 
} 
相關問題