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

4
如果我有一个如下命名的数组。
如何打印出"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;

http://www.ideone.com/iN2dt ? - Konerak
4个回答

8
通常我们使用数组的join方法来完成这个任务。以下是伪代码示例:
@array = qw[name1 name2 name2];
print "Hey ", join(" and ", @array), ".";

感谢 Henning 将此转换为 Perl。概念保持不变。 - Kaken Bok

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) 设置 $, (输出字段分隔符):

print 运算符的输出字段分隔符。如果定义了该值,则在打印每个参数之间打印此值。默认值为 undef。助记符:当 print 语句中出现 "," 时打印的内容。

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

两者都可以工作,并且都可以与 local 一起使用,以仅在封闭作用域内设置特殊变量的值。我想区别在于使用 $" 您不限于使用 print 命令:

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

这里的“魔法”发生在第三行而不是打印命令。

实际上,使用join是最可读的,除非您使用一个小的封闭块,否则未来的读者可能不会注意到设置了一个魔术变量(比如靠近顶部),并且永远不会看到行为与正常性能不符。我建议将这些技巧保留给小型单次操作和一行代码,并在生产代码中使用易读的join


2

未经测试:

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

你如何取消测试一行代码?用 perl -e 命令!(开个玩笑:p) - Yuji
3
$,意为:在数组元素之间打印的字符串。 - Ingo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接