用@l中的引号打印@

jms*_*980 4 quotes perl symbols

我想打印一行:

my email is "abc@gmail.com" 
Run Code Online (Sandbox Code Playgroud)

使用perl脚本.

以下是我要做的事情的片段:

print "my email is \"abc@gmail.com\";
Run Code Online (Sandbox Code Playgroud)

但是,当我运行该程序时,无法识别@符号.如何调整代码片段以便显示@?

Gra*_*ean 7

Perl社区的一个箴言是"有不止一种方法可以做到这一点".在这种情况下,有很多方法可以实现您想要做的事情,每种方法在不同情况下都会有优势.我在下面说明了一些答案.

首先,你没有提到你得到的输出.假设你的脚本顶部有一些合理的默认样板...

#!/usr/bin/perl

use 5.012;
use strict;
use warnings;
use autodie;
Run Code Online (Sandbox Code Playgroud)

那么这行代码......

print "my email is \"abc@gmail.com\"\n";
Run Code Online (Sandbox Code Playgroud)

应该给你一个类似这样的错误信息:

Possible unintended interpolation of @gmail in string at ./ptst.pl line 10.
Global symbol "@gmail" requires explicit package name at ./ptst.pl line 10.
Execution of ./ptst.pl aborted due to compilation errors.
Run Code Online (Sandbox Code Playgroud)

这告诉你Perl正在将@符号解释为数组名称的开头.因此它接下来的'word'并将其用作标识符名称,并认为您正在尝试引用数组变量@gmail.由于脚本没有my @gmail随处声明该数组,因此use strict会抛出致命异常.(注意:我稍微调整了你的代码以包含\n在最后添加换行符).

你可以做的最简单的改变就是\@符号前放一个反斜杠()以"转义"它 - 即:\@告诉Perl你只需要一个@字符,这不是数组标识符的开头.

print "my email is \"abc\@gmail.com\"\n";
Run Code Online (Sandbox Code Playgroud)

这看起来有点乱.一个原因是你有一个双引号字符串,其中包含双引号,因此它们也会被转义\".表示双引号字符串的另一种方法是使用qq运算符,然后选择自己的字符串分隔符.在这里,我使用花括号作为分隔符,因此嵌入的双引号不再需要转义:

print qq{my email is "abc\@gmail.com"\n};
Run Code Online (Sandbox Code Playgroud)

但是,使用双引号的主要原因是允许对字符串中的变量进行"插值"(即:变量名称将替换为变量的内容).但是你的字符串不包含任何变量.所以一个更好的修复可能只是使用单引号,它不进行变量插值,因此符号喜欢@并且$不是特殊的,不需要转义:

print 'my email is "abc@gmail.com"', "\n";
Run Code Online (Sandbox Code Playgroud)

不幸的是,双引号的另一个功能是允许您使用特殊序列,例如\n换行符或\t制表符.在我的例子中,我想要一个换行符,所以我利用了这个print函数接受一个参数列表并将其传递给两个字符串的事实:第一个使用单引号以避免转义,第二个使用双引号来允许转义序列.在另一个必须使用单个字符串而不是逗号分隔符的上下文中,您可以使用.运算符将两个字符串连接成一个:

my $message = 'my email is "abc@gmail.com"' . "\n";
Run Code Online (Sandbox Code Playgroud)

但是,如果使用双引号的唯一原因是在打印结束时添加换行符,那么您可以改为使用say与print完全相同的函数,但最后会添加换行符:

say 'my email is "abc@gmail.com"';
Run Code Online (Sandbox Code Playgroud)

如果你试试这个并得到一个错误,(Do you need to predeclare say?)那就是因为你错过了我在开始时提到的样板线.

您的原始脚本不使用变量,但添加变量将是解决问题的另一种方法:

my $email = 'abc@gmail.com';
say qq{my email is "$email"};
Run Code Online (Sandbox Code Playgroud)

要么:

my $email = 'abc@gmail.com';
say "my email is '$email'";
Run Code Online (Sandbox Code Playgroud)

最后,另一种有时有用的方法是使用printfsprintf将变量插入"模板"字符串.这可以方便地格式化带小数位的数字,添加前导零,用空格填充字符串等:

printf(qq{my email is "%s"\n}, $email);
Run Code Online (Sandbox Code Playgroud)

由于换行,这再次变得有点复杂.如果您不需要它,那么在格式字符串周围使用单引号会更容易:

printf('my email is "%s"', $email);
Run Code Online (Sandbox Code Playgroud)