পার্লে আমি কীভাবে একটি হ্যাশের সামগ্রী মুদ্রণ করতে পারি?


167

আমি বরাদ্দকৃত # বালতি / # হিসাবে আমার হ্যাশ মুদ্রণ করে চলেছি। আমি কীভাবে আমার হ্যাশগুলির বিষয়বস্তু মুদ্রণ করব?

একটি whileলুপ ব্যবহার না করা সবচেয়ে পছন্দসই হবে (উদাহরণস্বরূপ, একটি ওয়ান-লাইনার সেরা হবে)।

উত্তর:


253

ডেটা :: ডাম্পার আপনার বন্ধু।

use Data::Dumper;
my %hash = ('abc' => 123, 'def' => [4,5,6]);
print Dumper(\%hash);

আউটপুট হবে

$VAR1 = {
          'def' => [
                     4,
                     5,
                     6
                   ],
          'abc' => 123
        };

3
মূল পোস্টার খুব উপযোগী হতে পারে এ 'Sortkeys' বিশেষ বাঁক মধ্যে, বিভিন্ন ডেটা :: ডাম্পার অপশন দেখব করতে চাইতে পারেন
প্লাসপ্লাস

1
@ জোনাথনডে আমি এই বিশদটি অনুপস্থিত এবং এটি সহায়ক ছিল! ধন্যবাদ!
সোস

5
% এর সামনে একটি স্ল্যাশ যুক্ত করার অর্থ কী?
শ্যাম্পু

16
@ শ্যাম্পু স্ল্যাশ অপারেটর একটি রেফারেন্স তৈরি করে, কিছুটা &সি এবং সি ++-তে অপারেটরের মতো । এই প্রসঙ্গে এটির কারণটি হ'ল পার্লে, আপনি যদি হ্যাশ মান সহ কোনও ফাংশনটিকে আর্গুমেন্ট হিসাবে কল করেন তবে সেই হ্যাশটির মানটি একাধিক যুক্তিতে বিযুক্ত হয়ে যায় এবং প্রসারিত হয় - তাই %hsh=("a" => 1, "b" => 2); foo(%hsh);সমান হবে foo("a", 1, "b", 2)। : আপনি যদি এর পরিবর্তে ফাংশন হ্যাশ নিজেই কাজ করার চান, আপনি হ্যাশ একটি রেফারেন্স পাস করতে হবে foo(\%hsh);দেখুন perldoc.perl.org/perlsub.html#Pass-by-Reference
tetromino

63

সহজ:

print "$_ $h{$_}\n" for (keys %h);

মার্জিত, তবে আসলে 30% ধীর (!):

while (my ($k,$v)=each %h){print "$k $v\n"}

9
স্লাইজি: "@_ \ n" প্রিন্ট করুন যখন @_ = প্রতিটি% এইচ
এফএমসি

আমি মনে করি আপনি বোঝাতে চেয়েছেন print "$_ $h{$_}\n" for (keys %h);, $kসেই উদাহরণটিতে নেই।
চস ওয়েন্স

4
এছাড়াও, দক্ষতা সম্পর্কে দাবি করার আগে বেঞ্চমার্ক (বা আপনি যে দক্ষতার সাথে কথা বলছেন তা কমপক্ষে যোগ্যতা অর্জন করুন)। forলুপ দ্রুত চেয়ে while: অন্তত 10,000 কী পর্যন্ত gist.github.com/151792
Chas। ওয়েন্স

1
অবশ্যই আপনি ঠিক আবার: $ কে। তবে এটি পার্ল 6 এ আরও দক্ষ! :) হ্যাঁ, আপনিও ঠিক তাই আছেন। আমি কখনই আমার পার্লকে বাস্তবে অনুকূলিতকরণ বা প্রোফাইল করার চিন্তা করতাম না, তবে আমি এটি জানতে পেরে আনন্দিত glad অবশ্যই, প্রত্যেকের আরও দক্ষ হওয়া উচিত (কারণ কীটিতে কোনও অতিরিক্ত হ্যাশ লুক নেই)। তবে এটি 30% কম ধীর!
জোনাথন গ্রেহল

হাই, জোনাথন গ্রেহল দুঃখিত, এখনও বুঝতে পারছি না। আপনি বলছেন যে প্রতিটি কিসের উপর ভিত্তি করে 30% কম ধীর? প্রতিবারের জন্য, প্রতিটি পরিস্থিতির জন্য 30% ব্যবধান রয়েছে?
কার্লোস Sá


24

ডিবাগিংয়ের উদ্দেশ্যে আমি প্রায়শই ব্যবহার করব 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"
    }
}

রঙগুলি "ঝরঝরে" হ'ল, তবে হয় আমি কিছু ভুল করছি, বা "ডেটা :: প্রিন্টার ব্যবহার করি; পি% ভেরিয়া;" হ্যাশগুলিতে তীরগুলি মুদ্রণ করে না, এবং আমার মতো নবজাতকের জন্য যা সহায়তা করে
SOS

@ সোসি যদি আপনি উত্তরের আউটপুটটি দেখে থাকেন তবে আপনি দেখতে পাবেন যে এটি =>আপনার প্রত্যাশার মতো আউটপুট দেয় না । পরিবর্তে এটি সর্বদা কী, বিভিন্ন স্থান এবং তারপরে মানটি মুদ্রণ করে। যা আউটপুট ধরে একটি মানব স্ক্যান করতে সহায়তা করে।
ব্র্যাড গিলবার্ট

12

উত্তরটি আপনার হ্যাশটিতে রয়েছে তার উপর নির্ভর করে। আপনার যদি একটি সাধারণ হ্যাশ থাকে তবে সাধারণ

print map { "$_ $h{$_}\n" } keys %h;

অথবা

print "$_ $h{$_}\n" for keys %h;

করবে, তবে আপনার যদি এমন একটি হ্যাশ রয়েছে যা রেফারেন্স সহ জনবসতিপূর্ণ হয় তবে আপনি এমন কিছু করতে পারেন যা সেই রেফারেন্সগুলিতে হাঁটতে পারে এবং একটি বুদ্ধিমান আউটপুট তৈরি করতে পারে। রেফারেন্সগুলির এই পদচারকে সাধারণত সিরিয়ালাইজেশন বলা হয়। বিভিন্ন স্টাইল প্রয়োগ করে এমন অনেকগুলি মডিউল রয়েছে, আরও কয়েকটি জনপ্রিয় এটি হ'ল:

Data::Dumperমূল পার্ল লাইব্রেরির একটি অংশ এই সত্যের কারণে , এটি সম্ভবত সবচেয়ে জনপ্রিয়; তবে অন্যান্য কিছু মডিউলগুলির কাছে অফার করার জন্য খুব ভাল জিনিস রয়েছে।


10

আমার প্রিয়: স্মার্ট :: মন্তব্যসমূহ

use Smart::Comments;
# ...

### %hash

এটাই.


5
দুঃখিত, সত্যিকারের কার্যকারিতার জন্য মন্তব্যগুলিকে হাইজ্যাক করে এমন উপাদানগুলির জন্য আমার কাছ থেকে ভোট দিন vote কোনও রক্ষণাবেক্ষণ প্রোগ্রামার সারা দিন ব্যয় করতে পারে কেন এমন কোড কেন অপ্রত্যাশিত জিনিস প্রিন্ট করে।
মাইককুলস

2
@ মাইককুলস, এনপি। এটি উত্স ফিল্টার, তাই আমি বুঝতে পারি। এছাড়াও, লিখিত স্ক্রিপ্টগুলি রয়েছে যা আমি প্রডাকশন প্রিপগুলিতে রেখেছি এমন প্রতিটি মডিউল যাচাই করে তা পরীক্ষা করে না use Smart::Comments, আমি এটিকেও সেই দৃষ্টিকোণ থেকে দেখছি। তবে কাউন্টারটির কাছে স্কোপড মডিউল Smart::Commentsহিসাবে বেশ ভাল আচরণ করা হয় , এসসি ব্যবহার করে না এমন কোনও মডিউলে আউটপুট আচরণ হওয়া উচিত নয় । সুতরাং, সমস্যাটি ব্যবহারের বিবৃতি সহ সেই স্কোপগুলিতে বিচ্ছিন্ন হবে । যদি আপনি বলছেন যে কোনও রক্ষণাবেক্ষণকারী প্রোগ্রামারের অন্তর্ভুক্ত মডিউলগুলিতে ডকটি পড়ার কোনও দায়বদ্ধতা নেই, আমি সম্মত হতে পারি না। তবুও, মন্তব্য করার জন্য ধন্যবাদ
অ্যাক্সিম্যান

7
আমি বলছি না যে তাদের কোনও দায়বদ্ধতা নেই তবে তারা প্রথম জিনিস খুঁজছেন এমনটি হওয়ার সম্ভাবনা নেই। উপরের কোডটি কেন কিছু মুদ্রণ করছিল তা আমি জানতাম না আগে স্মার্ট মন্তব্য মডিউলটি আগে কখনও দেখেনি। আমি মন্তব্যটি এড়িয়ে কিছু দিন ব্যয় করতে পারতাম এবং এমনকি এটি প্রক্রিয়াও করতে পারি না কারণ মন্তব্যগুলির কিছু করা উচিত নয়। তাদের কিছু করা খুব খারাপ ইমো। তারা ডকুমেন্টেশন ইত্যাদি উত্পন্ন করার জন্য ব্যবহার করা যেতে পারে যতক্ষণ না তারা প্রোগ্রামটির আচরণ পরিবর্তন করে না।
মাইককুলস

4

looping:

foreach(keys %my_hash) { print "$_ / $my_hash{$_}\n"; }

ক্রিয়ামূলক

map {print "$_ / $my_hash{$_}\n"; } keys %my_hash;

তবে নিখুঁত কমনীয়তার জন্য আমাকে র্যাং-ওয়ারং বেছে নিতে হবে। আমার নিজের কোডের জন্য, আমি আমার ভবিষ্যদ্বাণী বেছে নেব। অথবা টেট্রোর ডাম্পার ব্যবহার।


3
আপনার ব্যবহারের foreachএবং এর মধ্যে কোনও কার্যকরী পার্থক্য নেই mapmapতালিকার রূপান্তরগুলির জন্য ব্যবহার করা উচিত, লুপের জন্য অনুকরণ করার জন্য
শূন্য

প্রত্যেকের 'বাইট কোড' ফলাফলগুলি দেখতে আকর্ষণীয় হবে ... আমি ভাবছি মানচিত্রটি কম বেশি কার্যকর কিনা।
এপি-ইনগো

2

আমার অভিজ্ঞতার সবচেয়ে সহজ উপায় হ'ল কেবল ডাম্পালু ব্যবহার করা ।

use Dumpvalue;
...
my %hash = { key => "value", foo => "bar" };
my $dumper = new DumpValue();
$dumper->dumpValue(\%hash);

একটি কবজির মতো কাজ করে এবং হ্যাশ ফর্ম্যাট করার বিষয়ে আপনাকে চিন্তা করতে হবে না, কারণ এটি পার্ল ডিবাগারের মতো করে তোলে (ডিবাগিংয়ের জন্য দুর্দান্ত)। এছাড়াও, ডাম্পভ্যালু পার্ল মডিউলগুলির স্টক সেটটির সাথে অন্তর্ভুক্ত রয়েছে, সুতরাং আপনি যদি কোনও ধরণের ড্র্যাকনিয়ান প্রক্সি (যেমন আমি কাজ করছি) এর পিছনে সিপএনের সাথে ঝামেলা করতে হবে না।


1

আপনি যদি পেডেন্টিক হতে চান এবং এটি এক লাইনে রাখতে চান (কোনও বিবৃতি এবং শেবাং ব্যবহার না করে), তবে আমি টেট্রোমিনোয়ের উত্তর ছাড়াই পিগিটি সাজাই এবং পরামর্শ দেব:

print Dumper( { 'abc' => 123, 'def' => [4,5,6] } );

টেম্পের ভেরিয়েবল এড়ানোর জন্য বেনামে হ্যাশ ব্যবহার করা ছাড়া অন্য কিছু করা না;)


ওপি জানিয়েছে যে তার কাছে "আমার হ্যাশ" রয়েছে যার মুদ্রণের প্রয়োজন রয়েছে। এই উত্তরটি কেবল নিজের স্বার্থের জন্য
চালাক

ওপি এক লাইনে এটি করার আশা করছিল। এটি করার এক-লাইন উপায় দেখানো হয়েছিল। সুতরাং যে একটি ডাউন ভোটের যোগ্য?
কাইল ওয়ালশ

1

আমি হ্যাশটির প্রতিটি উপাদানকে এটি দেখতে ভালভাবে দেখার জন্য একটি জায়গা রেখেছি:

print map {$_ . " "} %h, "\n";

1

আমি সত্যিই একটি লাইনার কোডে কীগুলি বাছাই করতে চাই:

print "$_ => $my_hash{$_}\n" for (sort keys %my_hash);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.