আমি বরাদ্দকৃত # বালতি / # হিসাবে আমার হ্যাশ মুদ্রণ করে চলেছি। আমি কীভাবে আমার হ্যাশগুলির বিষয়বস্তু মুদ্রণ করব?
একটি while
লুপ ব্যবহার না করা সবচেয়ে পছন্দসই হবে (উদাহরণস্বরূপ, একটি ওয়ান-লাইনার সেরা হবে)।
আমি বরাদ্দকৃত # বালতি / # হিসাবে আমার হ্যাশ মুদ্রণ করে চলেছি। আমি কীভাবে আমার হ্যাশগুলির বিষয়বস্তু মুদ্রণ করব?
একটি while
লুপ ব্যবহার না করা সবচেয়ে পছন্দসই হবে (উদাহরণস্বরূপ, একটি ওয়ান-লাইনার সেরা হবে)।
উত্তর:
ডেটা :: ডাম্পার আপনার বন্ধু।
use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);
আউটপুট হবে
$VAR1 = {
'def' => [
4,
5,
6
],
'abc' => 123
};
&
সি এবং সি ++-তে অপারেটরের মতো । এই প্রসঙ্গে এটির কারণটি হ'ল পার্লে, আপনি যদি হ্যাশ মান সহ কোনও ফাংশনটিকে আর্গুমেন্ট হিসাবে কল করেন তবে সেই হ্যাশটির মানটি একাধিক যুক্তিতে বিযুক্ত হয়ে যায় এবং প্রসারিত হয় - তাই %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
মূল পার্ল লাইব্রেরির একটি অংশ এই সত্যের কারণে , এটি সম্ভবত সবচেয়ে জনপ্রিয়; তবে অন্যান্য কিছু মডিউলগুলির কাছে অফার করার জন্য খুব ভাল জিনিস রয়েছে।
use
Smart::Comments
, আমি এটিকেও সেই দৃষ্টিকোণ থেকে দেখছি। তবে কাউন্টারটির কাছে স্কোপড মডিউল Smart::Comments
হিসাবে বেশ ভাল আচরণ করা হয় , এসসি ব্যবহার করে না এমন কোনও মডিউলে আউটপুট আচরণ হওয়া উচিত নয় । সুতরাং, সমস্যাটি ব্যবহারের বিবৃতি সহ সেই স্কোপগুলিতে বিচ্ছিন্ন হবে । যদি আপনি বলছেন যে কোনও রক্ষণাবেক্ষণকারী প্রোগ্রামারের অন্তর্ভুক্ত মডিউলগুলিতে ডকটি পড়ার কোনও দায়বদ্ধতা নেই, আমি সম্মত হতে পারি না। তবুও, মন্তব্য করার জন্য ধন্যবাদ
looping:
foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }
ক্রিয়ামূলক
map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;
তবে নিখুঁত কমনীয়তার জন্য আমাকে র্যাং-ওয়ারং বেছে নিতে হবে। আমার নিজের কোডের জন্য, আমি আমার ভবিষ্যদ্বাণী বেছে নেব। অথবা টেট্রোর ডাম্পার ব্যবহার।
foreach
এবং এর মধ্যে কোনও কার্যকরী পার্থক্য নেই map
। map
তালিকার রূপান্তরগুলির জন্য ব্যবহার করা উচিত, লুপের জন্য অনুকরণ করার জন্য
আমার অভিজ্ঞতার সবচেয়ে সহজ উপায় হ'ল কেবল ডাম্পালু ব্যবহার করা ।
use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);
একটি কবজির মতো কাজ করে এবং হ্যাশ ফর্ম্যাট করার বিষয়ে আপনাকে চিন্তা করতে হবে না, কারণ এটি পার্ল ডিবাগারের মতো করে তোলে (ডিবাগিংয়ের জন্য দুর্দান্ত)। এছাড়াও, ডাম্পভ্যালু পার্ল মডিউলগুলির স্টক সেটটির সাথে অন্তর্ভুক্ত রয়েছে, সুতরাং আপনি যদি কোনও ধরণের ড্র্যাকনিয়ান প্রক্সি (যেমন আমি কাজ করছি) এর পিছনে সিপএনের সাথে ঝামেলা করতে হবে না।
আপনি যদি পেডেন্টিক হতে চান এবং এটি এক লাইনে রাখতে চান (কোনও বিবৃতি এবং শেবাং ব্যবহার না করে), তবে আমি টেট্রোমিনোয়ের উত্তর ছাড়াই পিগিটি সাজাই এবং পরামর্শ দেব:
print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );
টেম্পের ভেরিয়েবল এড়ানোর জন্য বেনামে হ্যাশ ব্যবহার করা ছাড়া অন্য কিছু করা না;)