如何用双引号键入数组的选定元素

时间:2018-05-12 02:32:53

标签: arrays perl

在这里,我试图用双引号打印数组的第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三次。 当我将所有引号更改为双引号时,它会给出一个我理解为什么的错误。    我真的需要帮助。

如果我能用双引号打印所有三个元素而不必使用循环。谢谢!

2 个答案:

答案 0 :(得分:9)

要在"分隔的字符串中使用",请将其转义。

"foo: \"$bar\"\n"

您也可以切换分隔符(请注意"..."qq"..."的缩写)。

qq{foo: "$bar"\n}

答案 1 :(得分:2)

  1. 始终使用

    use strict;
    use warnings;
    

    即使是最短的Perl脚本。

    如果代码中存在拼写错误,Perl通常会在您包含错误时发出错误。没有,Perl会很乐意默默地做一些奇怪,错误和毫无意义的事情。

    1. 您的示例不会打印整个数组。相反,你会得到:

       '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中的每个项目。

      1. 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
          

          打印出来。

        要获得所需的输出,有多种方法可以解决:

        1. 最简单的方法 - 但不是最容易阅读复杂的字符串 - 是使用双引号并转义包含的引号:

          print " \"$fruits[$a]\" \n";
          
        2. 您可以对"..."使用通用表示法,qq{...}其中{}是一对大括号(()中的任意一个,{{1} }},[]{})或相同的其他非空格,非单词字符,例如:

          <>

          print qq{ "$fruits[$a]" \n};
          
        3. 您可以将字符串从单独引用的部分中连接起来:

          print qq! "$fruits[$a]" \n!;
          
        4. 最容易在代码中阅读将取决于字符串的复杂性和包含的变量:对于具有复杂解引用,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中不同引号的详细信息。