2010-06-24 232 views
4

我想與像C:\foo的路徑來代替的東西,所以我:Perl的串子

s/hello/c:\foo 

但是,這是無效的。 我需要逃脫一些字符嗎?

+0

當我讀到這個問題的標題(「Perl string sub」)時,我認爲這將是一個關於通過符號表查找動態調用*子程序的問題。 :) – pilcrow 2010-06-25 14:25:46

回答

5

兩個問題,我可以看到。

你的第一個問題是,你的s///更換不被終止:

s/hello/c:\foo # fatal syntax error: "Substitution replacement not terminated" 
s/hello/c:\foo/ # syntactically okay 
s!hello!c:\foo! # also okay, and more readable with backslashes (IMHO) 

你的第二個問題,你問到的一個,就是\f被當作換轉義序列(ASCII 0x0C ),就像它會用雙引號,這不是你想要的。

您既可以逃避反斜槓,或讓變量插值「隱藏」的問題:

s!hello!c:\\foo!   # This will do what you want. Note double backslash. 

my $replacement = 'c:\foo' # N.B.: Using single quotes here, not double quotes 
s!hello!$replacement!;  # This also works 

看看的報價及報價般的運營商perlop治療以獲取更多信息。

2

如果我理解你的要求,那麼這可能是像你以後:

$path = "hello/there"; 
$path =~ s/hello/c:\\foo/; 
print "$path\n"; 

要回答你的問題,是的,你確實需要,因爲\f是一種逃避反斜槓翻番在Perl字符串中「換頁」的順序。

+1

最後一句話是錯誤的,實際上'\ f'是* form feed *的有效轉義序列。 – daxim 2010-06-25 07:29:59

+0

確實,固定。換頁不是我經常使用的! – 2010-06-26 05:41:12

1

的問題是,你是不是逃避特殊字符:

s/hello/c:\\foo/; 

會解決你的問題。 \是一個特殊字符,所以你需要逃避它。 {}[]()^$.|*+?\是元(特殊)字符,你需要逃脫。

附加參考:http://perldoc.perl.org/perlretut.html