Cách dễ dàng để in mảng Perl? (với một chút định dạng)


96

Có cách nào dễ dàng để in ra một mảng Perl có dấu phẩy ở giữa mỗi phần tử không?

Viết một vòng lặp for để làm điều đó khá dễ dàng nhưng không hoàn toàn thanh lịch .... nếu điều đó hợp lý.

Câu trả lời:


149

Chỉ cần sử dụng join():

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

9
Hoặc, nếu bạn muốn được thực sự bẩn: {local $,=', ';print @array}.
musiKk

10
Có nhiều cách để làm điều đó .. nhưng đây là cách không khiến người duy trì mã sau khi ghét bạn. Có, perlvar perldoc tồn tại, nhưng tôi thà xem qua "join", "@array" hơn là nhấn vào perlvar mọi dòng khác để tìm ra tất cả các biến bí truyền đang làm gì.
Oesor

@Oesor: Đó là lý do tại sao tôi gọi nó là bẩn. Nhưng tốt, nhìn vào các câu trả lời khác, tôi không thực sự là người phạm tội nặng nhất. :)
musiKk

@musiKK Tôi thích nó! Đó là thứ mà tôi sẽ sử dụng nếu tôi muốn đánh đố đồng nghiệp của mình. :)
Alex

3
Điều này thực sự hiệu quả để in nội dung thư mục. print "current directory contains " . join(', ', <*>) . "\n";
Randall

31

Bạn có thể sử dụng Data::Dump:

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

Sản xuất:

"(1, [2, 3], { 4 => 5 })"

2
Trên Ubuntu / Mint, hãy cài đặt gói libdata-dump-perl.
MUY Bỉ

2
Câu trả lời hay nhất ở đây! Hoạt động với các mảng đa chiều. Linh hoạt nhất.
Léo Léopold Hertz 준영

18

Nếu bạn đang viết mã cho kiểu rõ ràng sẽ được hiểu bởi một người mới bắt đầu với Perl, cấu trúc truyền thống này nói lên ý nghĩa của nó, với mức độ rõ ràng và dễ đọc cao:

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

Cấu trúc này được ghi lại trong perldoc -fjoin.

Tuy nhiên, tôi luôn thích cách $,làm nó đơn giản . Biến đặc biệt $"dành cho phép nội suy và biến đặc biệt $,dành cho danh sách. Kết hợp một trong hai với hạn chế phạm vi động ' local' để tránh có hiệu ứng gợn sóng trong suốt tập lệnh:

use 5.012_002;
use strict;
use warnings;

my @array = qw/ 1 2 3 4 5 /;

{
    local $" = ', ';
    print "@array\n"; # Interpolation.
}

HOẶC với $ ,:

use feature q(say);
use strict;
use warnings;

my @array = qw/ 1 2 3 4 5 /;
{
    local $, = ', ';
    say @array; # List
}

Các biến đặc biệt $,$"được ghi lại trong perlvar . Các localtừ khóa, và làm thế nào nó có thể được sử dụng để hạn chế những ảnh hưởng của thay đổi giá trị của một dấu chấm câu biến toàn cầu của có lẽ là tốt nhất mô tả trong perlsub .

Thưởng thức!


10

Ngoài ra, bạn có thể muốn thử Data :: Dumper . Thí dụ:

use Data::Dumper;

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

4
Dữ liệu :: Dumper là một mô-đun tiêu chuẩn và được cài đặt cùng với Perl. Để có danh sách tất cả các ngữ dụng và mô-đun tiêu chuẩn, hãy xem pelrdoc perlmodlib.
shawnhcorey

7

Để kiểm tra / gỡ lỗi, hãy kiểm tra Data::Printermô-đun. Nó có nghĩa là để làm một điều và một điều duy nhất:

hiển thị các biến Perl và các đối tượng trên màn hình, được định dạng đúng (được con người kiểm tra)

Ví dụ sử dụng:

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

Đoạn mã trên có thể xuất ra một cái gì đó như thế này (với màu sắc!):

   [
       [0] "a",
       [1] "b",
       [2] undef,
       [3] "c",
   ]

Trong Ubuntu, người ta có thể cài đặt libdata-printer-perlgói.
Planetp

3

Bạn có thể đơn giản printnó.

@a = qw(abc def hij);

print "@a";

Bạn sẽ có:

abc def hij

1
Bạn có dấu phẩy trong bản in vì chúng nằm trong mỗi phần tử của mảng. Bạn thực sự nên khai báo use warnings;và xem nó nói gì.
Toto

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

use JSON::XS;
print encode_json \@some_array

1

Sử dụng 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)]);

Tạo ba kiểu đầu ra khác nhau:

$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

Đây có thể không phải là thứ bạn đang tìm kiếm, nhưng đây là điều tôi đã làm cho một nhiệm vụ:

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

0

Bản đồ cũng có thể được sử dụng, nhưng đôi khi khó đọc khi bạn có nhiều việc đang diễn ra.

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

0

Tuy nhiên, tôi đã không cố gắng chạy bên dưới. Tôi nghĩ đây là một cách khó.

map{print $_;} @array;
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.