Простий спосіб друку масиву Perl? (з невеликим форматуванням)


96

Чи є простий спосіб роздрукувати масив Perl з комами між кожним елементом?

Написати цикл for для цього досить просто, але не зовсім елегантно .... якщо це має сенс.

Відповіді:


149

Просто використовуйте join():

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

9
Або, якщо ви дійсно хочете бути забруднений {local $,=', ';print @array}.
musiKk

10
Існує більше ніж один спосіб зробити це .. але це спосіб, який не змушує людину підтримувати код після того, як ви ненавидите вас. Так, perldoc perlvar існує, але я волів би переглядати "join", '@array ", ніж натискати perlvar на будь-який інший рядок, щоб з'ясувати, що роблять всі езотеричні змінні.
Oesor

@Oesor: Ось чому я назвав це брудним. Але добре, дивлячись на інші відповіді, я насправді не найгірший злочинець. :)
musiKk

@musiKK Мені це подобається! Це те, що я б використав, якби хотів спантеличити своїх колег по роботі. :)
Алекс

3
Це дуже добре працювало для друку вмісту каталогу. print "current directory contains " . join(', ', <*>) . "\n";
Randall


18

Якщо ви кодуєте для такої ясності, яку зрозумів би той, хто тільки починає з Perl, традиційна ця конструкція з високим ступенем чіткості та читабельності говорить, що це означає:

$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 .

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


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;і подивитися, що там сказано.
Тото

2
# better than Dumper --you're ready for the WWW....

use JSON::XS;
print encode_json \@some_array

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

1

Це може бути не те, що ви шукаєте, але ось щось я зробив для завдання:

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

0

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

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

0

Однак я не намагався пробігти нижче. Я думаю, це хитрий спосіб.

map{print $_;} @array;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.