2017-02-19 191 views
3

如何才能打印包含雙反斜槓\\字符的字符串(單引號),而無需使Perl以某種方式將其插入單斜槓\?我不想通過添加更多轉義字符來更改字符串。如何防止Perl將雙反斜槓解釋爲單反斜槓字符?

my $string1 = 'a\\\b'; 
print $string1; #prints 'a\b' 

my $string1 = 'a\\\\b'; 
    #I know I can alter the string to escape each backslash 
    #but I want to keep string as is. 
print $string1; #prints 'a\\b' 

#I can also use single-quoted here document 
#but unfortunately this would make my code syntactically look horrible. 
my $string1 = <<'EOF'; 
a\\b 
EOF 
print $string1; #prints a\\b, with newline that could be removed with chomp 
+0

讓我猜...處理Windows文件路徑? – Schwern

+0

不,我將單引號字符串傳遞給子例程,這些字符串包含雙反斜線。 – Omar

+0

哦。你能舉個例子嗎?您不應該在單引號內部使用雙引號。 「她說,」你不必在單引號中雙引號。「」沒關係。所以如果你想要插值但是不想用雙引號來使用'qq []'。 – Schwern

回答

9

唯一引用構建的Perl不解釋反斜槓在所有的單引號here文檔:

my $string1 = <<'EOF'; 
a\\\b 
EOF 
print $string1; # Prints a\\\b, with newline 

因爲在這裏,文檔是基於行的,這是不可避免的,你會在字符串末尾換行,但可以用chomp刪除它。

其他技術就是簡單地與它一起生活,並正確反斜線(對於少量數據),或將它們放入__DATA__部分或外部文件(對於大量數據)。

+1

我不知道! – Schwern

+0

單引號這裏的文件解決方案對每個字符串我會讓我的代碼在語法上看起來很可怕。 – Omar

+0

@奧瑪,我只是在陳述事實。您可以反斜槓反斜槓,可以使用heredocs,也可以將這些路徑保存在Perl源文件以外的某處。據我所知,沒有任何其他合理的選擇,所以選擇一個你不喜歡的人:) – hobbs

0

由於反斜槓內插發生在字符串文字中,因此也許您可以使用其他任意符號聲明您的文字,然後將它們替換爲其他內容。

my $string = 'a!!!b'; 
$string =~ s{!}{\\}g; 
print $string; #prints 'a\\\b' 

當然它並沒有成爲!,不以字符串會做一個正常的角色衝突的任何符號。你說你需要做一些字符串,所以你可以把替代的功能

sub bs { 
    $_[0] =~ s{!}{\\}gr 
} 

my $string = 'a!!!b'; 
print bs($string); #prints 'a\\\b' 

附: 該功能使用v5.14中介紹的非破壞性替代修飾符/r。如果您使用的是舊版本,則該函數將需要這樣寫

sub bs { 
    $_[0] =~ s{!}{\\}g; 
    return $_[0]; 
} 

或者,如果你喜歡的東西更具可讀性

sub bs { 
    my $str = shift; 
    $str =~ s{!}{\\}g; 
    return $str; 
} 
6

如果你是有些瘋狂,而像的想法使用實驗性軟件,利用perl的內部機制來改善代碼的美感,您可以在今天上午使用CPAN上的Syntax::Keyword::RawQuote模塊。

use syntax 'raw_quote'; 
my $string1 = r'a\\\b'; 
print $string1; # prints 'a\\\b' 

感謝@melpomene的靈感。

+0

這很鼓舞人心。 – zdim