Простой способ распечатать массив Perl? (с небольшим форматированием)

88

Есть ли способ easy распечатать массив Perl с запятыми между каждым элементом?

Написание цикла for для этого довольно легко, но не очень элегантно.... если это имеет смысл.

Теги:

11 ответов

134
Лучший ответ

Просто используйте join():

# assuming @array is your array:
print join(", ", @array);
  • 9
    Или, если вы хотите быть очень грязным: {local $,=', ';print @array} .
  • 8
    Есть несколько способов сделать это ... но это способ, который не заставляет человека поддерживать код после того, как вы ненавидите вас. Да, perldoc perlvar существует, но я бы лучше посмотрел на «join», «@array», чем на perlvar каждую вторую строку, чтобы понять, что делают все эзотерические переменные.
Показать ещё 3 комментария
26

Вы можете использовать Data::Dump:

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

Выдает:

"(1, [2, 3], { 4 => 5 })"
  • 2
    В Ubuntu / Mint установите пакет libdata-dump-perl.
  • 2
    Лучший ответ здесь! Работает с многомерными массивами тоже. Самый гибкий.
18

Если вы кодируете ясность, понятную кому-то, кто только начинает с Perl, традиционная эта конструкция говорит о том, что это означает, с высокой степенью ясности и удобочитаемости:

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

Эта конструкция задокументирована в perldoc -f join.

Однако мне всегда нравилось, как это делает простой $,. Специальная переменная $" предназначена для интерполяции, а специальная переменная $, предназначена для списков. Объедините один из них с динамическим ограничением по объему "local", чтобы избежать эффекта пульсации во всем script:

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.

Наслаждайтесь!

8

Кроме того, вы можете попробовать Data:: Dumper. Пример:

use Data::Dumper;

# simple procedural interface
print Dumper($foo, $bar);
  • 4
    Data :: Dumper является стандартным модулем и устанавливается вместе с Perl. Чтобы получить список всех стандартных прагматик и модулей, см. pelrdoc perlmodlib .
6

Для проверки/отладки проверьте модуль Data::Printer. Он предназначен только для одной вещи и только одной вещи:

отображать Perl-переменные и объекты на экране, правильно отформатированные (до проверяться человеком)

Пример использования:

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

В приведенном выше коде может выводиться что-то вроде этого (с цветами!):

   [
       [0] "a",
       [1] "b",
       [2] undef,
       [3] "c",
   ]
  • 0
    Под Ubuntu можно установить libdata-printer-perl .
2
# better than Dumper --you're ready for the WWW....

use JSON::XS;
print encode_json \@some_array
2

Вы можете просто print его.

@a = qw(abc def hij);

print "@a";

Вы получите:

abc def hij
  • 1
    У вас есть запятые в печати, потому что они есть в каждом элементе массива. Вы действительно должны объявить use warnings; и посмотрим, что там написано.
  • 0
    Вы правы. Я починил это. :)
0

Однако я не пробовал работать ниже. Я считаю это сложным способом.

map{print $_;} @array;
0

Карта также может использоваться, но иногда ее трудно читать, когда у вас много вещей.

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

Возможно, это не то, что вы ищете, но вот что я сделал для назначения:

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

Использование 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'
          ];

Ещё вопросы

Сообщество Overcoder
Наверх
Меню