如何简单地打印Perl数组?(带有一些格式)

107

有没有一种简单的方法将Perl数组中的每个元素之间用逗号隔开并打印出来?

编写for循环实现这个目标相当容易,但不够优雅...如果这能说明问题。

11个回答

161

只需使用join()函数即可:

# assuming @array is your array:
print join(", ", @array);

9
或者,如果你想非常粗暴: {local $,=', ';print @array} - musiKk
10
有多种方法可以实现,但这种方式不会让接手代码维护的人讨厌你。是的,perldoc perlvar 中存在相关信息,但我宁愿浏览 "@array join', '" ,也不想每隔一行就查阅 perlvar 来了解那些奇怪的变量在做什么。 - Oesor
@Oesor:这就是为什么我称之为“脏”的原因。不过,看看其他答案,我并不是最糟糕的罪魁祸首。 :) - musiKk
@musiKK 我喜欢它!如果我想要让我的同事们感到困惑,这是我会使用的东西。 :) - Alex
4
这段代码非常适合打印目录内容。print "当前目录包含 " . join(', ', <*>) . "\n"; - Randall

37

您可以使用Data::Dump

use Data::Dump qw(dump);
my @a = (1, [2, 3], {4 => 5});
dump(@a);

生成:

"(1, [2, 3], { 4 => 5 })"

2
在Ubuntu/Mint上,安装libdata-dump-perl软件包。 - MUY Belgium
2
最佳答案在这里!也适用于多维数组。最灵活的。 - Léo Léopold Hertz 준영

20

如果你正在编写能够被刚开始接触 Perl 的人理解的清晰代码,那么使用传统的 this 结构可以非常清晰易读地表达其含义:

$string = join ', ', @array;
print "$string\n";

这种结构在perldoc -fjoin中有文档记录。

然而,我一直喜欢 $, 的简单易用。特殊变量$"用于插值,而特殊变量$,用于列表。将它们与动态作用域约束的'local'结合使用,可以避免脚本中产生连锁反应:

use 5.012_002;
use strict;
use warnings;

my @array = qw/ 1 2 3 4 5 /;

{
    local $" = ', ';
    print "@array\n"; # Interpolation.
}

使用$进行或运算:

use feature q(say);
use strict;
use warnings;

my @array = qw/ 1 2 3 4 5 /;
{
    local $, = ', ';
    say @array; # List
}
特殊变量$,$"perlvar中有文档记录。如何使用local关键字来限制修改全局标点符号变量值的影响,最好在perlsub中进行描述。
祝您使用愉快!

10

另外,您可能想尝试 Data::Dumper。例如:

use Data::Dumper;

# simple procedural interface
print Dumper($foo, $bar);

4
Data::Dumper 是一个标准模块,随 Perl 一同安装。要获取所有标准语法和模块的列表,请参见perldoc perlmodlib - shawnhcorey

7

进行检查/调试时,请查看Data::Printer模块。它只有一个目的:

在屏幕上以适当的格式(供人类检查)显示Perl变量和对象

使用示例:

use Data::Printer;  
p @array;  # no need to pass references

上面的代码可能会输出类似于这样的内容(带有颜色!):
   [
       [0] "a",
       [1] "b",
       [2] undef,
       [3] "c",
   ]

在Ubuntu下,可以安装libdata-printer-perl软件包。 - planetp

4
你可以简单地打印它。
@a = qw(abc def hij);

print "@a";

你将得到:

您将获得:

abc def hij

2
你在打印输出中使用逗号是因为它们在数组的每个元素中。你真的应该声明 use warnings; 并查看它的提示。 - Toto

2
# better than Dumper --you're ready for the WWW....

use JSON::XS;
print encode_json \@some_array

1
这可能不是你正在寻找的,但这是我为一项任务所做的东西:
$" = ", ";
print "@ArrayName\n";

这个 $" 变量在哪里有文档记录?它有一个名称吗?编辑:在这里找到了它的文档:https://perldoc.perl.org/variables - Roman

1

我没有尝试运行下面的代码,因为我认为这是一个棘手的方法。

map{print $_;} @array;

1

地图也可以使用,但是当你有很多事情要处理时,有时候很难阅读。

map{ print "element $_\n" }   @array; 

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