2010-11-05 48 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