Einfache Möglichkeit, Perl-Array zu drucken? (mit ein wenig Formatierung)

96

Gibt es eine einfache Möglichkeit, ein Perl-Array mit Kommas zwischen den einzelnen Elementen auszudrucken?

Eine for-Schleife zu schreiben ist ziemlich einfach, aber nicht ganz elegant ... wenn das Sinn macht.

Funk-Shun
quelle

Antworten:

149

Verwenden Sie einfach join():

# assuming @array is your array:
print join(", ", @array);
Alex
quelle
9
Oder wenn Sie wirklich schmutzig sein wollen : {local $,=', ';print @array}.
musiKk
10
Es gibt mehr als einen Weg, dies zu tun. Aber dies ist der Weg, der die Person nicht dazu bringt, den Code zu pflegen, nachdem Sie Sie gehasst haben. Ja, Perldoc Perlvar existiert, aber ich würde lieber einen Blick auf "join ',' @array" werfen, als jede zweite Zeile perlvar aufzurufen, um herauszufinden, was alle esoterischen Variablen tun.
Oesor
@Oesor: Deshalb habe ich es schmutzig genannt. Aber wenn ich mir die anderen Antworten ansehe, bin ich nicht wirklich der schlimmste Täter. :)
musiKk
@musiKK Ich mag es! Es ist etwas, das ich verwenden würde, wenn ich meine Kollegen verwirren wollte. :)
Alex
3
Dies funktionierte sehr gut zum Drucken des Verzeichnisinhalts. print "current directory contains " . join(', ', <*>) . "\n";
Randall
31

Sie können verwenden Data::Dump:

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

Produziert:

"(1, [2, 3], { 4 => 5 })"
Eugene Yarmash
quelle
2
Installieren Sie unter Ubuntu / Mint das Paket libdata-dump-perl.
MUY Belgien
2
Beste Antwort hier! Funktioniert auch mit mehrdimensionalen Arrays. Am flexibelsten.
Léo Léopold Hertz 준영
18

Wenn Sie für die Art von Klarheit programmieren, die von jemandem verstanden wird, der gerade erst mit Perl anfängt, sagt das traditionelle Konstrukt, was es bedeutet, mit einem hohen Maß an Klarheit und Lesbarkeit:

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

Dieses Konstrukt ist in dokumentiert perldoc -fjoin.

Mir hat jedoch immer gefallen, wie einfach es $,macht. Die spezielle Variable $"dient zur Interpolation und die spezielle Variable $,zur Liste. Kombinieren Sie eine der beiden Optionen mit dynamischen Bereichsbeschränkungen local, um Welligkeitseffekte im gesamten Skript zu vermeiden:

use 5.012_002;
use strict;
use warnings;

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

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

ODER mit $,:

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

my @array = qw/ 1 2 3 4 5 /;
{
    local $, = ', ';
    say @array; # List
}

Die speziellen Variablen $,und $"sind in Perlvar dokumentiert . Das localSchlüsselwort und wie es verwendet werden kann, um die Auswirkungen der Änderung des Werts einer globalen Interpunktionsvariablen einzuschränken, wird wahrscheinlich am besten in perlsub beschrieben .

Genießen!

DavidO
quelle
10

Vielleicht möchten Sie auch Data :: Dumper ausprobieren . Beispiel:

use Data::Dumper;

# simple procedural interface
print Dumper($foo, $bar);
Andreas
quelle
4
Data :: Dumper ist ein Standardmodul und wird zusammen mit Perl installiert. Eine Liste aller Standard-Pragmatiken und -Module finden Sie unter pelrdoc perlmodlib.
Shawnhcorey
7

Überprüfen Sie das Data::PrinterModul auf Inspektion / Debugging . Es soll nur eins und eins tun:

Anzeige von Perl-Variablen und -Objekten auf dem Bildschirm, ordnungsgemäß formatiert (von einem Menschen zu überprüfen)

Anwendungsbeispiel:

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

Der obige Code könnte Folgendes ausgeben (mit Farben!):

   [
       [0] "a",
       [1] "b",
       [2] undef,
       [3] "c",
   ]
Eugene Yarmash
quelle
Unter Ubuntu kann man das libdata-printer-perlPaket installieren .
Planetp
3

Sie können es einfach print.

@a = qw(abc def hij);

print "@a";

Sie erhalten:

abc def hij
Yi Zhao
quelle
1
Sie haben Kommas im Druck, da sie sich in jedem Element des Arrays befinden. Sie sollten wirklich erklären use warnings;und sehen, was es sagt.
Toto
2
# better than Dumper --you're ready for the WWW....

use JSON::XS;
print encode_json \@some_array
gleeco
quelle
1

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

Generiert drei verschiedene Ausgabestile:

$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'
          ];
TVNshack
quelle
1

Dies ist vielleicht nicht das, wonach Sie suchen, aber hier ist etwas, das ich für einen Auftrag getan habe:

$" = ", ";
print "@ArrayName\n";
009
quelle
0

Die Karte kann auch verwendet werden, ist aber manchmal schwer zu lesen, wenn viele Dinge vor sich gehen.

map{ print "element $_\n" }   @array; 
PodTech.io
quelle
0

Ich habe jedoch nicht versucht, unten zu rennen. Ich denke, das ist ein kniffliger Weg.

map{print $_;} @array;
K. Minoda
quelle