如果我有一个名字如下的数组。
如何打印“嗨乔和杰克和约翰”?
当数组中只有一个名称时,算法也应该有效。
#!/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 :(得分: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
作为生产代码。