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.

Antworten:


149

Verwenden Sie einfach join():

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

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 })"

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!


10

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

use Data::Dumper;

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

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",
   ]

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

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

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

1

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

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

0

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

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

0

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

map{print $_;} @array;
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.