ฉันพิมพ์แฮชของฉันตามจำนวน # ถัง / # ที่จัดสรร ฉันจะพิมพ์เนื้อหาของแฮชของฉันได้อย่างไร
หากไม่ใช้การwhile
วนซ้ำจะเป็นที่นิยมมากที่สุด (ตัวอย่างเช่นการซับแบบหนึ่งจะดีที่สุด)
ฉันพิมพ์แฮชของฉันตามจำนวน # ถัง / # ที่จัดสรร ฉันจะพิมพ์เนื้อหาของแฮชของฉันได้อย่างไร
หากไม่ใช้การwhile
วนซ้ำจะเป็นที่นิยมมากที่สุด (ตัวอย่างเช่นการซับแบบหนึ่งจะดีที่สุด)
คำตอบ:
Data :: Dumperเป็นเพื่อนของคุณ
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
จะส่งออก
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
ดำเนินการใน C และ C ++ เหตุผลที่มันเป็นเรื่องสำคัญในบริบทนี้คือว่าใน Perl ถ้าคุณเรียกใช้ฟังก์ชันที่มีค่าแฮชเป็นอาร์กิวเมนต์, ค่าแฮชที่ได้รับ listified และขยายเข้าสู่การขัดแย้งหลาย - ดังนั้นจะเทียบเท่ากับ%hsh=("a" => 1, "b" => 2); foo(%hsh);
foo("a", 1, "b", 2)
หากคุณต้องการให้ฟังก์ชั่นทำงานกับแฮชตัวเองคุณต้องผ่านการอ้างอิงถึงแฮช: foo(\%hsh);
ดูperldoc.perl.org/perlsub.html#Pass-by-Reference
ง่าย:
print "$_ $h{$_}\n" for (keys %h);
สง่า แต่ช้ากว่าจริง 30% (!):
while (my ($k,$v)=each %h){print "$k $v\n"}
print "$_ $h{$_}\n" for (keys %h);
, $k
ไม่ได้อยู่ในตัวอย่างที่
for
วนซ้ำเร็วกว่าwhile
แป้นอย่างน้อย 10,000 แป้น: gist.github.com/151792
นี่คือวิธีที่คุณสามารถพิมพ์ได้โดยไม่ต้องใช้ Data::Dumper
print "@{[%hash]}";
YAML
เพื่อวัตถุประสงค์ในการแก้จุดบกพร่องผมมักจะใช้
use strict;
use warnings;
use YAML;
my %variable = ('abc' => 123, 'def' => [4,5,6]);
print "# %variable\n", Dump \%variable;
ผลลัพธ์ใน:
# %variable
---
abc: 123
def:
- 4
- 5
- 6
ครั้งอื่น ๆ Data::Dump
ผมจะใช้ Data::Dumper
คุณไม่จำเป็นต้องตั้งเป็นตัวแปรมากมายที่จะได้รับมันจะส่งออกในรูปแบบที่ดีกว่าที่คุณทำเพื่อ
use Data::Dump = 'dump';
print dump(\%variable), "\n";
{ abc => 123, def => [4, 5, 6] }
ไม่นานมานี้ฉันได้ใช้Data::Printer
สำหรับการดีบัก
use Data::Printer;
p %variable;
{
abc 123,
def [
[0] 4,
[1] 5,
[2] 6
]
}
(ผลลัพธ์อาจมีสีสันมากกว่าบนเทอร์มินัล)
ซึ่งแตกต่างจากตัวอย่างอื่น ๆ ที่ฉันได้แสดงไว้ที่นี่สิ่งนี้ได้รับการออกแบบอย่างชัดเจนเพื่อวัตถุประสงค์ในการแสดงผลเท่านั้น ซึ่งจะปรากฏขึ้นได้ง่ายขึ้นหากคุณทิ้งโครงสร้างของตัวแปรที่ผูกหรือว่าของวัตถุ
use strict;
use warnings;
use MTie::Hash;
use Data::Printer;
my $h = tie my %h, "Tie::StdHash";
@h{'a'..'d'}='A'..'D';
p %h;
print "\n";
p $h;
{
a "A",
b "B",
c "C",
d "D"
} (tied to Tie::StdHash)
Tie::StdHash {
public methods (9) : CLEAR, DELETE, EXISTS, FETCH, FIRSTKEY, NEXTKEY, SCALAR, STORE, TIEHASH
private methods (0)
internals: {
a "A",
b "B",
c "C",
d "D"
}
}
=>
คุณคาดหวัง มันมักจะพิมพ์กุญแจช่องว่างหลาย ๆ และค่า ซึ่งช่วยให้มนุษย์สแกนมากกว่าผลลัพธ์
คำตอบขึ้นอยู่กับสิ่งที่อยู่ในแฮชของคุณ หากคุณมีแฮชแบบง่าย ๆ
print map { "$_ $h{$_}\n" } keys %h;
หรือ
print "$_ $h{$_}\n" for keys %h;
จะทำ แต่ถ้าคุณมีแฮชที่เต็มไปด้วยการอ้างอิงคุณจะทำสิ่งที่สามารถเดินการอ้างอิงเหล่านั้นและสร้างผลลัพธ์ที่สมเหตุสมผล การเดินอ้างอิงนี้ปกติเรียกว่าการทำให้เป็นอันดับ มีโมดูลจำนวนมากที่ใช้สไตล์ที่แตกต่างซึ่งเป็นที่นิยมมากขึ้นคือ:
เนื่องจากความจริงที่ว่าData::Dumper
เป็นส่วนหนึ่งของห้องสมุด Perl หลักมันน่าจะเป็นที่นิยมมากที่สุด; อย่างไรก็ตามโมดูลอื่น ๆ บางอย่างมีสิ่งที่ดีมากที่จะนำเสนอ
use
Smart::Comments
ฉันก็เห็นมันจากมุมมองนั้น แต่สำหรับตัวนับSmart::Comments
นั้นค่อนข้างทำตัวเป็นโมดูลที่กำหนดขอบเขตไม่ควรมีพฤติกรรมการส่งออกในโมดูลใด ๆ ที่ไม่ได้ใช้ SC ดังนั้นปัญหาจะถูกแยกออกไปขอบเขตที่มีคำสั่งการใช้งาน หากคุณกำลังบอกว่าโปรแกรมเมอร์บำรุงรักษาไม่มีความรับผิดชอบในการอ่านเอกสารเกี่ยวกับโมดูลที่รวมไว้ฉันไม่สามารถตกลงได้ ยังคงขอบคุณที่แสดงความคิดเห็น
วนรอบ:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
การทำงาน
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
แต่เพื่อความสง่างามอย่างแท้จริงฉันจะต้องเลือกของ Wrang-wrang สำหรับรหัสของฉันเองฉันจะเลือก foreach ของฉัน หรือเทตโตรที่ใช้รถเทเปอร์
foreach
ควรจะใช้สำหรับการแปลงรายการไม่ได้อยู่ในบริบทที่จะเลียนแบบเป็นโมฆะสำหรับวงmap
map
วิธีที่ง่ายที่สุดในประสบการณ์ของฉันเป็นเพียงแค่ใช้Dumpvalue
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
ใช้งานได้อย่างมีเสน่ห์และคุณไม่ต้องกังวลเกี่ยวกับการจัดรูปแบบแฮชเนื่องจากมันให้ผลลัพธ์เหมือนกับที่ดีบักเกอร์ Perl ใช้ (เหมาะสำหรับการดีบั๊ก) นอกจากนี้ Dumpvalue จะรวมอยู่ในชุดหุ้นของโมดูล Perl ดังนั้นคุณไม่ต้องยุ่งกับ CPAN ถ้าคุณอยู่หลัง draconian proxy (เหมือนกับที่ฉันทำงาน)
หากคุณต้องการที่จะอวดความคิดและเก็บไว้ในบรรทัดเดียว (โดยไม่ต้องใช้คำสั่งและ Shebang) แล้วฉันจะเรียงลำดับหมูออกจากคำตอบของ tetromino และแนะนำ:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
ไม่ทำอะไรเป็นพิเศษนอกจากการใช้แฮชไม่ระบุชื่อเพื่อข้ามตัวแปร temp;)
ฉันผนวกหนึ่งช่องว่างสำหรับทุกองค์ประกอบของแฮชเพื่อให้ดูดี:
print map {$_ . " "} %h, "\n";
ฉันชอบเรียงลำดับคีย์ในหนึ่งรหัสซับ:
print "$_ => $my_hash{$_}\n" for (sort keys %my_hash);