如何在数组元素之间打印'AND'?

时间:2011-08-17 12:46:51

标签: arrays perl

如果我有一个名字如下的数组。

如何打印“嗨乔和杰克和约翰”?

当数组中只有一个名称时,算法也应该有效。

#!/usr/bin/perl

use warnings;
use strict;

my @a = qw /joe jack john/;

my $mesg = "Hi ";

foreach my $name (@a) {

    if ($#a == 0) {
    $mesg .= $name;
    } else {
    $mesg .= " and " . $name;
    }
}

print $mesg;

4 个答案:

答案 0 :(得分:8)

通常我们使用数组连接方法来完成此任务。这里是伪代码:

@array = qw[name1 name2 name2];
print "Hey ", join(" and ", @array), ".";

答案 1 :(得分:2)

未测试:

{ local $, = " and "; print "Hi "; print  @a; }

答案 2 :(得分:2)

只需使用特殊变量$"

$"="and"; #" (this last double quote is to help the syntax coloring)
$mesg="Hi @a";

答案 3 :(得分:2)

要收集perldoc perlvar个答案,您可以(至少)做两件事之一。

1)设置$"(列表分隔符):

  

将数组或数组切片插入到双引号中   字符串或类似的上下文,如/.../,其元素是分开的   通过这个值。默认是一个空格。例如,这个:

print "The array is: @array\n";
  

相当于:

print "The array is: " . join($", @array) . "\n";

=> $"会影响数组插值到字符串

的行为

2)设置$,(输出字段分隔符):

  

打印操作员的输出字段分隔符。如果定义,这个   在每个print的参数之间打印值。默认为undef。   助记符:打印声明中有“,”时打印的内容。

=> $,会影响print语句的行为。

两者都可以使用,并且可以与local一起使用,以仅在封闭范围内设置特殊变量的值。我猜不同之处在于,使用$"时,您不仅限于打印命令:

my @z = qw/ a b c /;
local $" = " and ";
my $line = "@z";
print $line;

这里“魔术”发生在第3行而非打印命令。

事实上,使用join是最具可读性的,除非你使用一个小的封闭块,未来的读者可能不会注意到魔术变量的设置(比较靠近顶部)并且永远不会看到行为不是正常表现的预期。我会为小型一次性和单行保存这些技巧,并使用可读的join作为生产代码。

相关问题