在这里,我试图用双引号打印数组的第2,第3和第4个元素,我只能用单引号来做。
my @fruits = ("apples", "oranges", "guavas", "passionfruits", "grapes");
my $a = 1;
while ($a<4){
print " '$fruits[$a]' \n";
$a += 1;
}
但我不能用单引号做到这一点。当我将单引号更改为双引号,反之亦然时,它会打印"$fruits[$a]"\n
三次。
当我将所有引号更改为双引号时,它会给出一个我理解为什么的错误。
我真的需要帮助。
如果我能用双引号打印所有三个元素而不必使用循环。谢谢!
答案 0 :(得分:9)
要在"
分隔的字符串中使用"
,请将其转义。
"foo: \"$bar\"\n"
您也可以切换分隔符(请注意"..."
是qq"..."
的缩写)。
qq{foo: "$bar"\n}
答案 1 :(得分:2)
始终使用
use strict;
use warnings;
即使是最短的Perl脚本。
如果代码中存在拼写错误,Perl通常会在您包含错误时发出错误。没有,Perl会很乐意默默地做一些奇怪,错误和毫无意义的事情。
您的示例不会打印整个数组。相反,你会得到:
'oranges'
'guavas'
'passionfruits'
数组的第一个索引是0
,因此'apples'
被跳过,因为$a
是使用1
初始化的。由于在打印4
之前达到值'grapes'
,因此也会退出循环。
要打印整个阵列,您可以这样做:
如果您需要在某处使用索引值$i
:
for my $i (0 .. $#fruits) {
print " $i: '$fruits[$i]' \n";
}
($#fruits
是@fruits
的最后一个索引,等于数组的大小减1.由于此数组有5个项,索引值的范围从0到4)
否则:
foreach my $current_fruit (@fruits) {
print " '$current_fruit' \n";
}
其中$current_fruit
依次设置为数组@fruits
中的每个项目。
Perl函数中的引号用作运算符,并且根据您使用的引用,它们可能会也可能不会使用包含的字符串执行各种操作。
在您的示例中,双引号将对字符串进行插值,替换$fruits[$a]
的值并替换转义序列\n
。因此:
print " '$fruits[$a]' \n";
(对于$a == 1
)变为:
'oranges'
相反,单引号将不进行插值。
只需单引号本身(以及单引号前的反斜杠)需要使用反斜杠进行转义。 (可以选择转义其他反斜杠。)所有其他字符序列将按原样显示,因此print
中的参数位于:
print ' "$fruits[$a]" \n';
完全被视为文字字符串,因此
"$fruits[$a]" \n "$fruits[$a]" \n "$fruits[$a]" \n
打印出来。
要获得所需的输出,有多种方法可以解决:
最简单的方法 - 但不是最容易阅读复杂的字符串 - 是使用双引号并转义包含的引号:
print " \"$fruits[$a]\" \n";
您可以对"..."
使用通用表示法,qq{...}
其中{}
是一对大括号(()
中的任意一个,{{1} }},[]
或{}
)或相同的其他非空格,非单词字符,例如:
<>
或
print qq{ "$fruits[$a]" \n};
您可以将字符串从单独引用的部分中连接起来:
print qq! "$fruits[$a]" \n!;
最容易在代码中阅读将取决于字符串的复杂性和包含的变量:对于具有复杂解引用,indeces和散列键的真正长字符串,您可能希望使用选项3,而对于简短的字符串2将是最好的。
我的整个编辑代码:
print ' "' . $fruits[$a] . '"' . " \n";
您可以从perldoc(或类UNIX系统上的人)页面use strict;
use warnings;
my @fruits = ("apples", "oranges", "guavas", "passionfruits", "grapes");
for my $i (0 .. $#fruits) {
print " $i: \"$fruits[$i]\" \n";
print qq< $i: "$fruits[$i]" \n>;
print ' ' . $i . ': "' . $fruits[$i] . '"' . " \n";
}
foreach my $current_fruit (@fruits) {
print " \"$current_fruit\" \n";
print qq¤ "$current_fruit" \n¤;
print ' "' . $current_fruit . '"' . " \n";
}
及其section titled "Quote and Quote-like Operators"了解有关Perl中不同引号的详细信息。