Perl配列を出力する簡単な方法は?(少しフォーマットして)


96

各要素の間にコンマを含むPerl配列を出力する簡単な方法はありますか?

それを行うためのforループの作成は非常に簡単ですが、かなりエレガントではありません...それが理にかなっている場合。

回答:


149

ただ使用するjoin()

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

9
または、本当に汚くなりたい場合:{local $,=', ';print @array}
musiKk

10
それを行うには複数の方法があります。しかし、これはあなたが嫌い​​になった後にその人がコードを保守するようにしない方法です。はい、perldoc perlvarが存在しますが、すべての難解な変数が何をしているのかを理解するために、perlvarを1行おきに調べるよりも、「join '、' @array」を一目見たいと思います。
Oesor

@Oesor:だから私はそれを汚いと呼んだ。しかし、よく、他の答えを見て、私は本当に最悪の犯罪者ではありません。:)
musiKk 2011

@musiKKいいね!これは、同僚を困惑させたい場合に使用します。:)
アレックス

3
これは、ディレクトリの内容を印刷するのにとてもうまくいきました。 print "current directory contains " . join(', ', <*>) . "\n";
Randall


18

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とともにインストールされます。すべての標準的な語用論とモジュールのリストを取得するには、を参照してくださいpelrdoc perlmodlib
shawnhcorey

7

検査/デバッグについては、Data::Printerモジュールを確認してください。これは、1つのことだけを行うことを意図しています。

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)]);

3つの異なる出力スタイルを生成します。

$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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.