2011-08-17 36 views
4

如果我有一个名字如下的数组。如何在数组元素之间打印“AND”?

如何打印“Hi joe and jack and john”?

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

#!/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; 
+0

http://www.ideone.com/iN2dt? – Konerak 2011-08-27 22:54:17

回答

8

通常我们使用数组的连接方法来做到这一点。这里伪代码:

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

未经测试:

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

你怎么能测试一个班轮?做`perl -e`! (我在开玩笑:p) – Yuji 2011-08-17 12:50:50

+0

`$,`是什么意思? – 2011-08-17 12:56:20

+3

$,表示:在数组元素之间打印的字符串。 – Ingo 2011-08-17 13:00:01

2

只需使用特殊变量$"

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

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

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

当一个数组或数组切片被内插到一个双引号 字符串或类似情况下,如/.../,其元素是用此值分隔 。默认是一个空格。例如,这样的:

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

等效于此:

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

=>$"影响所述阵列的所述内插的行为为一个字符串

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

打印操作员的输出字段分隔符。如果已定义,则在每个打印参数之间打印该值 。默认是undef。 助记符:打印语句中有“,”时打印的内容。

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

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

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

这里的“神奇”发生在3号线没有打印命令。

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