打印Perl数组的简单方法?(略有格式化)


96

有没有一种简单的方法来打印出每个元素之间带有逗号的Perl数组?

编写一个for循环来做到这一点很容易,但并不十分优雅。

Answers:


149

只需使用join()

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

9
或者,如果您想真正变脏:{local $,=', ';print @array}
musiKk 2011年

10
有多种方法可以执行此操作..但是,这种方法不会使您讨厌您的人仍然维护代码。是的,perldoc perlvar存在,但是我宁愿浏览“ join','@array”,也不愿每隔一行查找perlvar来了解所有深奥的变量在做什么。
Oesor 2011年

@Oesor:这就是为什么我称它为肮脏。但是,看看其他答案,我并不是最严重的罪犯。:)
musiKk 2011年

@musiKK我喜欢!如果我想迷惑同事,这就是我要使用的东西。:)
Alex

3
这对于打印目录内容非常有效。 print "current directory contains " . join(', ', <*>) . "\n";
Randall


18

如果您正在为那些刚开始使用Perl的人所能理解的那种清晰度进行编码,那么传统的此构造会以高度的清晰度和易读性来说明其含义:

$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一起安装。要获取所有标准实用程序和模块的列表,请参阅pelrdoc perlmodlib
shawnhcorey 2011年

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

3

您可以简单地print做到这一点。

@a = qw(abc def hij);

print "@a";

您将获得:

abc def hij

1
您在逗号中有逗号,因为它们在数组的每个元素中。您确实应该声明use warnings;并查看其内容。
Toto

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

use JSON::XS;
print encode_json \@some_array

1

使用Data::Dumper

use strict;
use Data::Dumper;

my $GRANTstr = 'SELECT, INSERT, UPDATE, DELETE, LOCK TABLES, EXECUTE, TRIGGER';
$GRANTstr    =~ s/, /,/g;
my @GRANTs   = split /,/ , $GRANTstr;

print Dumper(@GRANTs) . "===\n\n";

print Dumper(\@GRANTs) . "===\n\n";

print Data::Dumper->Dump([\@GRANTs], [qw(GRANTs)]);

生成三种不同的输出样式:

$VAR1 = 'SELECT';
$VAR2 = 'INSERT';
$VAR3 = 'UPDATE';
$VAR4 = 'DELETE';
$VAR5 = 'LOCK TABLES';
$VAR6 = 'EXECUTE';
$VAR7 = 'TRIGGER';
===

$VAR1 = [
          'SELECT',
          'INSERT',
          'UPDATE',
          'DELETE',
          'LOCK TABLES',
          'EXECUTE',
          'TRIGGER'
        ];
===

$GRANTs = [
            'SELECT',
            'INSERT',
            'UPDATE',
            'DELETE',
            'LOCK TABLES',
            'EXECUTE',
            'TRIGGER'
          ];

1

这可能不是您想要的,但是这是我为一项作业所做的:

$" = ", ";
print "@ArrayName\n";

0

也可以使用地图,但是当您发生许多事情时,有时很难阅读。

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

0

不过,我没有尝试在下面运行。我认为这是一个棘手的方法。

map{print $_;} @array;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.