Perl - 如何转义/编码特殊字符

4

我正在编写一个IRC脚本,有时可能需要使用颜色。通常我会这样做:

my $C = chr(3);

$C是用于颜色控制的控制码,但我看到有些脚本会对其进行转义,例如"\x\v..."。我该如何获取正确编码的版本?我尝试了Data::Dumper,但没有找到它。希望我的问题表述清楚。


@Wireless 在这个网站上有一些惯例。其中之一是,如果你提出了一个问题,并得到了好的和正确的答案,你需要选择一个作为“已接受”的答案,这将为回答你问题并花费时间和精力的人赚取15个声望点。无论你是否在其他地方找到了答案:你在这里发布的问题确实得到了答案 - Sinan Ünür
4个回答

5

使用十六进制转义码来指定 chr(3) 的方法是:

print "\x03\n";

或者,以八进制表示为:
print "\003\n";

或者,作为一种控制代码:
print "\cC\n";

请参考perldoc perlop
以下转义序列可在插值和音译中使用。
- \t 制表符(HT、TAB) - \n 换行符(NL) - \r 回车符(CR) - \f 换页符(FF) - \b 退格符(BS) - \a 警报(响铃)(BEL) - \e 转义符(ESC) - \033 八进制字符(例如:ESC) - \x1b 十六进制字符(例如:ESC) - \x{263a} 宽十六进制字符(例如:SMILEY) - \c[ 控制字符(例如:ESC) - \N{name} 命名的Unicode字符

2
perlop!我查看了perlsyn、perldata和perlintro寻找这个。 - mob
1
@mobrule:我作弊了:http://www.google.com/search?q=character+escape+sequence+site%3Aperldoc.perl.org - Sinan Ünür

5

代码范围在0到255之间的字符可以用多种方式表示。这些例子都打印出字符A

print chr(65);
print "\101";     # octal notation
print "\x41";     # hexidecimal notation (and hexadecimal notation)
printf "%c",65;


或者针对您的特定问题:

print chr(3);
print "\003";
print "\3";
print "\x03";     # hexidecimal notation (and hexadecimal notation)
printf "%c",3;
print "\cc";      # from Sinan's answer
print "\cC";

啊,我明白了。所以我认为这是我在其他脚本中看到的十六进制表示法。那么我该如何将chr(3)转换为十六进制表示法呢? - somebody
1
@mobrule,我认为你已经把所有的事情都考虑到了 :-) - Sinan Ünür

3

您可以通过多种机制打印十六进制编码(甚至是八进制或二进制编码)的字符(这绝不是一个全面的列表):

# generate strings from hex:
my $space_char = sprintf("%x", 0x20);
my $space_char2 = "\x20";
my $space_char3 = 0x20;
my $space_char4 = pack("L", 0x20);
my $space_char5 = chr(0x20);

您可以在perldoc perlfunc上阅读这些函数,或通过单独的perldoc -f sprintfperldoc -f packperldoc -f chr等进行了解。
有关十六进制、八进制和二进制数字的更多信息,请参见《perldoc perldata》中的“标量值构造函数”部分。

你能给我一个获取 chr(3) 的十六进制版本的例子,而不是反过来的吗? - somebody
我找到了答案。谢谢大家。 - somebody
@Wireless,“我找到答案了”是什么意思?这里有一些非常好的答案,比如@Ether和@mobrule给出的答案。你应该选择其中一个作为你在这里提出的问题的答案。 - Sinan Ünür
抱歉,这只是对之前关于示例“chr(3)”的评论的跟进。 - somebody

1
请参阅 perldoc perlre 中的转义序列字符类和其他特殊转义部分。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接