Easy way to print Perl array? (with a little formatting)
PerlPerl Problem Overview
Is there an easy way to print out a Perl array with commas in between each element?
Writing a for loop to do it is pretty easy but not quite elegant....if that makes sense.
Perl Solutions
Solution 1 - Perl
Just use join()
:
# assuming @array is your array:
print join(", ", @array);
Solution 2 - Perl
You can use Data::Dump
:
use Data::Dump qw(dump);
my @a = (1, [2, 3], {4 => 5});
dump(@a);
Produces:
"(1, [2, 3], { 4 => 5 })"
Solution 3 - Perl
If you're coding for the kind of clarity that would be understood by someone who is just starting out with Perl, the traditional this construct says what it means, with a high degree of clarity and legibility:
$string = join ', ', @array;
print "$string\n";
This construct is documented in perldoc -f
join
.
However, I've always liked how simple $,
makes it. The special variable $"
is for interpolation, and the special variable $,
is for lists. Combine either one with dynamic scope-constraining 'local
' to avoid having ripple effects throughout the script:
use 5.012_002;
use strict;
use warnings;
my @array = qw/ 1 2 3 4 5 /;
{
local $" = ', ';
print "@array\n"; # Interpolation.
}
OR with $,:
use feature q(say);
use strict;
use warnings;
my @array = qw/ 1 2 3 4 5 /;
{
local $, = ', ';
say @array; # List
}
The special variables $,
and $"
are documented in perlvar. The local
keyword, and how it can be used to constrain the effects of altering a global punctuation variable's value is probably best described in perlsub.
Enjoy!
Solution 4 - Perl
Also, you may want to try Data::Dumper. Example:
use Data::Dumper;
# simple procedural interface
print Dumper($foo, $bar);
Solution 5 - Perl
For inspection/debugging check the Data::Printer
module. It is meant to do one thing and one thing only:
> display Perl variables and objects on screen, properly formatted (to > be inspected by a human)
Example usage:
use Data::Printer;
p @array; # no need to pass references
The code above might output something like this (with colors!):
[
[0] "a",
[1] "b",
[2] undef,
[3] "c",
]
Solution 6 - Perl
You can simply print
it.
@a = qw(abc def hij);
print "@a";
You will got:
abc def hij
Solution 7 - Perl
# better than Dumper --you're ready for the WWW....
use JSON::XS;
print encode_json \@some_array
Solution 8 - Perl
Using 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)]);
Generates three different output styles:
$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'
];
Solution 9 - Perl
This might not be what you're looking for, but here's something I did for an assignment:
$" = ", ";
print "@ArrayName\n";
Solution 10 - Perl
Map can also be used, but sometimes hard to read when you have lots of things going on.
map{ print "element $_\n" } @array;
Solution 11 - Perl
I've not tried to run below, though. I think this's a tricky way.
map{print $_;} @array;