मैं पर्ल में हैश की सामग्री कैसे प्रिंट कर सकता हूं?


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' को चालू करने में बहुत उपयोगी हो सकता है
plusplus

1
@JonathanDay मुझे वह विवरण याद आ रहा था और यह मददगार था! धन्यवाद!
एसओएस

5
% के सामने स्लैश जोड़ने का क्या मतलब है?
शैंपू

16
@shampoo स्लैश ऑपरेटर &C और C ++ में ऑपरेटर की तरह एक संदर्भ बनाता है । इस संदर्भ में इसका कारण यह है कि पर्ल में, यदि आप एक फ़ंक्शन को हैश मान के साथ तर्क के रूप में कहते हैं, तो हैश मान को सूचीबद्ध किया जाता है और कई तर्कों में विस्तारित किया जाता है - इसलिए %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" प्रिंट करें जबकि @_ = प्रत्येक% h
FMc

मुझे लगता है कि आपका मतलब है print "$_ $h{$_}\n" for (keys %h);, $kउस उदाहरण में मौजूद नहीं है।
चास। ओवेन्स

4
इसके अलावा, दक्षता के बारे में दावे करने से पहले बेंचमार्क (या कम से कम आप जिस दक्षता के बारे में बात कर रहे हैं, उस प्रकार के योग्य हैं)। forपाश से अधिक तेजी से है while: कम से कम 10,000 कुंजियों तक gist.github.com/151792
चास। ओवेन्स

1
बेशक आप फिर से सही हो: $ k। लेकिन यह पर्ल 6 में अधिक कुशल है! :) हाँ, तुम उस पर भी सही हो। मैंने कभी भी अपने पर्ल को वास्तव में अनुकूलित या प्रोफाइल करने के लिए नहीं सोचा होगा, लेकिन मुझे यह जानने में खुशी है। बेशक, प्रत्येक को अधिक कुशल होना चाहिए (क्योंकि कुंजी पर कोई अतिरिक्त हैश लुक नहीं है)। लेकिन यह ~ 30% धीमा है!
जोनाथन ग्रेहल

हाय, जोनाथन ग्रेहल। क्षमा करें, अभी भी समझ नहीं आ रहा है। आप कह रहे हैं कि प्रत्येक ~ 30% किसके आधार पर धीमा है? क्या हर समय, हर स्थिति के लिए 30% का अंतर है?
कार्लोस साए


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"
    }
}

रंग होना "साफ" है, लेकिन या तो मैं कुछ गलत कर रहा हूं, या "डेटा का उपयोग कर रहा हूं :: प्रिंटर; पी% वार"; हैश में तीर नहीं छापता है, और मेरी तरह एक नौसिखिया के लिए जो मदद करता है
एसओएस

@ सोसी यदि आप उत्तर में आउटपुट को देखते हैं, तो आप देखेंगे कि यह उस =>तरह से आउटपुट नहीं करता है जैसा आप उम्मीद करते हैं। इसके बजाय यह हमेशा कुंजी, कई रिक्त स्थान और फिर मूल्य को प्रिंट करता है। जो आउटपुट पर मानव स्कैन में मदद करता है।
ब्रैड गिल्बर्ट

12

उत्तर इस बात पर निर्भर करता है कि आपके हैश में क्या है। यदि आपके पास एक साधारण हैश एक साधारण है

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

या

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

करेंगे, लेकिन अगर आपके पास एक हैश है जो संदर्भों के साथ आबाद है तो आप कुछ ऐसा करेंगे जो उन संदर्भों को चला सकता है और एक समझदार आउटपुट का उत्पादन कर सकता है। संदर्भों के इस चलना को आमतौर पर क्रमबद्धता कहा जाता है। कई मॉड्यूल हैं जो विभिन्न शैलियों को लागू करते हैं, कुछ अधिक लोकप्रिय हैं:

इस तथ्य के कारण कि Data::Dumperकोर पर्ल लाइब्रेरी का हिस्सा है, यह शायद सबसे लोकप्रिय है; हालांकि, कुछ अन्य मॉड्यूल में बहुत अच्छी चीजें हैं।


10

मेरा पसंदीदा: Smart :: टिप्पणियाँ

use Smart::Comments;
# ...

### %hash

बस।


5
क्षमा करें, वास्तविक कार्यक्षमता के लिए टिप्पणियों को हाईजैक करने वाले सामान के लिए मुझसे वोट डाउन करें। एक रखरखाव प्रोग्रामर सारा दिन काम करने की कोशिश में बिता सकता है क्यों कोड जैसे कि अप्रत्याशित सामान को प्रिंट कर रहा था।
माइककूल

2
@ मायकेकल, एनपी। यह एक स्रोत फिल्टर है, इसलिए मैं समझता हूं। साथ ही, लिखित स्क्रिप्ट होने से जो हर मॉड्यूल की जांच करता है, जिसे मैं उत्पादन में डाल देता हूं जो यह नहीं करता है use Smart::Comments, मैं इसे उस परिप्रेक्ष्य से भी देखता हूं। लेकिन काउंटर के लिए, Smart::Commentsएक स्कोप्ड मॉड्यूल के रूप में बहुत अच्छा व्यवहार किया जाता है , किसी भी मॉड्यूल में आउटपुट व्यवहार नहीं होना चाहिए जो SC का उपयोग भी नहीं करता है । इसलिए, समस्या उन स्कोपों ​​को एक उपयोग विवरण के साथ पृथक किया जाएगा । यदि आप कह रहे हैं कि एक रखरखाव प्रोग्रामर में शामिल मॉड्यूल पर डॉक्टर को पढ़ने की कोई जिम्मेदारी नहीं है, तो मैं सहमत नहीं हो सकता। फिर भी, टिप्पणी करने के लिए धन्यवाद
एक्समैन

7
मैं यह नहीं कह रहा हूं कि उनके पास कोई जिम्मेदारी नहीं है, लेकिन यह पहली चीज नहीं है जिसकी वे तलाश करते हैं। पहले कभी स्मार्ट टिप्पणियाँ मॉड्यूल नहीं देखा था, क्योंकि मुझे नहीं पता था कि उपरोक्त कोड कुछ क्यों प्रिंट कर रहा था। मैं टिप्पणी पर लंघन के दिन बिता सकता था और इसे संसाधित भी नहीं कर सकता था क्योंकि टिप्पणियों को कुछ भी नहीं करना चाहिए। उन्हें कुछ करना बहुत खराब है। जब तक वे कार्यक्रम के व्यवहार में परिवर्तन नहीं करते, तब तक उनका उपयोग प्रलेखन आदि के लिए किया जा सकता है।
मिकुल्ल्स

4

लूपिंग:

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

कार्यात्मक

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

लेकिन सरासर लालित्य के लिए, मुझे wrang-wrang का चयन करना होगा। अपने स्वयं के कोड के लिए, मैं अपना फ़ार्च चुनूंगा। या टेट्रो का डम्पर उपयोग।


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);
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.