วิธีง่ายๆในการพิมพ์ Perl array? (ด้วยการจัดรูปแบบเล็กน้อย)


98

มีวิธีง่ายๆในการพิมพ์อาร์เรย์ Perl โดยใช้เครื่องหมายจุลภาคระหว่างแต่ละองค์ประกอบหรือไม่?

การเขียน for loop นั้นทำได้ค่อนข้างง่าย แต่ไม่สวยหรูนัก .... ถ้าเป็นเช่นนั้น

คำตอบ:


150

เพียงใช้join():

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

9
หรือถ้าคุณอยากสกปรกจริงๆ: {local $,=', ';print @array}.
musiKk

10
มีมากกว่าหนึ่งวิธีที่จะทำ .. แต่นี่เป็นวิธีที่ไม่ทำให้คนที่รักษารหัสหลังจากที่คุณเกลียดคุณ ใช่ perldoc perlvar มีอยู่ แต่ฉันอยากจะดู "join", "@array" มากกว่าที่จะตี perlvar ทุกบรรทัดเพื่อดูว่าตัวแปรลึกลับทั้งหมดกำลังทำอะไรอยู่
Oesor

@Oesor: นั่นสิทำไมเรียกว่าสกปรก แต่เมื่อมองไปที่คำตอบอื่น ๆ ฉันไม่ใช่ผู้กระทำความผิดที่เลวร้ายที่สุด :)
musiKk

@musiKK ชอบ! เป็นสิ่งที่ฉันจะใช้หากต้องการไขปริศนาเพื่อนร่วมงาน :)
Alex

3
สิ่งนี้ใช้ได้ดีมากสำหรับการพิมพ์เนื้อหาไดเรกทอรี print "current directory contains " . join(', ', <*>) . "\n";
Randall

32

คุณสามารถใช้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
คำตอบที่ดีที่สุดที่นี่! ทำงานร่วมกับอาร์เรย์หลายมิติได้เช่นกัน ยืดหยุ่นมากที่สุด
LéoLéopold Hertz 준영

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 perlsub

สนุก!


10

นอกจากนี้คุณอาจต้องการที่จะลองข้อมูล :: 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


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;
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.