2010-11-05 82 views
1

有沒有簡單的方法,使用一個子例程,可以在Perl中打印一個字符串而不會逃脫每個特殊字符?在Perl中打印字符串

這就是我想做的事:

print DELIMITER <I don't care what is here> DELIMITER 

所以,很顯然它會很大,如果我可以把一個字符串作爲分隔符,而不是特殊字符。

+0

你可以舉一些你覺得打印麻煩的字符串的例子嗎? – Ether 2010-11-05 18:13:43

+0

它有很多單引號.Idea是打印字符串的內容,而不管它裏面的內容。打印子例程,您可以在其中指定字符串分隔符。 – Jean 2010-11-05 18:19:48

+2

@alertjean這將是'q //'和'qq //'通用字符串運算符。你可以指定分隔符,所以你可以說'我的$ s = qq(這個包含'和');'有兩種類型的分隔符:包圍和非包圍,包圍分隔符是'()','[] ''''''''和'<>'。第一個字符開始字符串,第二個字符關閉它,但要注意嵌套是允許的(所以'qq(他說「嘿(那是我的爸爸)」); '是一個有效的字符串)非括號分隔符在第二次看到時會關閉字符串(例如'qq/foo /;') – 2010-11-05 19:32:33

回答

4
$str = q(this is a "string"); 
print $str; 

,如果你的意思是引號和撇號與「特殊字符」

2

印刷沒有做特別的東西給逃逸,雙引號中的字符串在這樣做。你可能想嘗試單引號字符串:

print 'this is \n', "\n"; 

在一個單引號字符必須轉義的唯一字符是單引號和該字符串的結尾(即'foo\\')之前立即出現反斜槓。

重要的是要注意的是插不與單引號字符串的工作,所以

print 'foo is $foo', "\n"; 

不會打印$foo內容。

0

如果你想從字面上打印一個字符串,你有Perl 5.10或更高版本,然後

say 'This is a string with "quotes"' ; 

將打印字符串以一個換行符。該importaning就是用單引號' '而非雙那些" "

+0

你可以用'say '做到這一點,但你需要'使用功能'say''或指定一個最低版本,如'使用5.10.0'來做到這一點,或者你可以n在一個班輪中用-E而不是-e。請參閱'perldoc功能'。 – 2010-11-07 04:49:00

8

perldoc perlop,在「Quote and Quote-like Operators」下,包含您需要的一切。

儘管我們通常將引號看作字面值,但在Perl中它們充當運算符,提供各種插值和模式匹配功能。 Perl爲這些行爲提供習慣的引用字符,但也爲您提供了一種方法讓您爲它們中的任何一個選擇您的引用字符。在下表中,「{}」表示您選擇的任何一對分隔符。

Customary Generic  Meaning  Interpolates 
    ''  q{}   Literal    no 
    ""  qq{}   Literal    yes 
    ``  qx{}   Command    yes* 
      qw{}   Word list   no 
    //  m{}  Pattern match   yes* 
      qr{}   Pattern    yes* 
      s{}{}  Substitution   yes* 
      tr{}{} Transliteration   no (but see below) 
    <<EOF     here-doc   yes* 

    * unless the delimiter is ''. 
3

可以使用__DATA__指令,它會將所有的以下行作爲可以從DATA手柄訪問的文件:

while (<DATA>) { 
    print # or do something else with the lines 
} 

__DATA__ 
#!/usr/bin/perl -w 
use Some::Module; 
.... 

,或者您可以使用定界符:

my $string = <<'END'; #single quotes prevent any interpolation 
#!/usr/bin/perl -b 
use Some::Module; 
.... 
END 
1

你幾乎可以使用任何你想要的字符qqq。例如:

#!/usr/bin/perl 

use utf8; 
use strict; use warnings; 

print q∞This is a test∞; 
print qq☼\nThis is another test\n☼; 
print q»But, what is the point?»; 
print qq\nYou are just making life hard on yourself!\n; 
print qq¿That last one is tricky\n¿; 

您不能使用qq DELIMITER foo DELIMITER。但是,你可以使用here文檔有同樣的效果:

print <<DELIMITER 
... 
DELIMETER 
; 

print <<'DELIMETER' 
... 
DELIMETER 
; 

但你的源代碼將真的難看。

+1

我有一個有保證的解決方案:代碼點U + FFFE和F + FFFF(等)保證是非法的交換,但你可以在內部使用它們。這還包括代碼點> 0x10_FFFF,如'\ x {DEADBEEF}'。 – tchrist 2010-11-06 02:00:42

+0

我以爲你應該把分號放在符合<<以允許同一行中有多個heredocs的行上?即'print''DELIMITER'; ...' – 2010-11-07 04:47:49