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

97

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

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

фанк-шун
источник

Ответы:

150

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

# assuming @array is your array:
print join(", ", @array);
Alex
источник
9
Или, если вы действительно хотите быть загрязнен {local $,=', ';print @array}.
musiKk
10
Есть несколько способов сделать это ... но этот способ не заставляет человека, поддерживающего код, ненавидеть вас. Да, perldoc perlvar существует, но я бы предпочел просмотреть "join ',' @array", чем заглядывать в perlvar каждую вторую строку, чтобы выяснить, что делают все эзотерические переменные.
Oesor
@Oesor: Вот почему я назвал это грязным. Но что ж, глядя на другие ответы, я на самом деле не худший преступник. :)
musiKk
@musiKK Мне это нравится! Я бы использовал это, если бы хотел озадачить своих коллег по работе. :)
Alex
3
Это действительно хорошо сработало для печати содержимого каталога. print "current directory contains " . join(', ', <*>) . "\n";
Randall
31

Вы можете использовать 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.
MUY Belgium
2
Лучший ответ здесь! Также работает с многомерными массивами. Самый гибкий.
Лео Леопольд Герц 준영
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 .

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

DavidO
источник
10

Также вы можете попробовать Data :: Dumper . Пример:

use Data::Dumper;

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

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

отображать переменные и объекты 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
Gleeco
источник
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)]);

Создает три разных стиля вывода:

$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
источник
1

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

$" = ", ";
print "@ArrayName\n";
009
источник
0

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

map{ print "element $_\n" }   @array; 
PodTech.io
источник
0

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

map{print $_;} @array;
К.Минода
источник