perl - डिफ़ॉल्ट के साथ हैश असाइनमेंट में तत्वों की विषम संख्या




(2)

आप मूल्य के आधार पर अपने सब्सट्रेटिन के लिए अपने हैश पास करना चाहते हैं और इससे समस्या पैदा होती है इसके बजाय संदर्भ में अपने हैश %h2 को पारित करने की कोशिश करें ( % से पहले देखें):

&hash2print(\%h2, 1);

फिर अपने उप हैश 2 hash2print , आप निम्नलिखित तरीके से हैश वापस प्राप्त कर सकते हैं:

sub hash2print {
    (my $hashref, my $debug) = @_;
    my %HoH = %$hashref; # dereference $hashref to get back the hash
    ...

आप यहां संदर्भों के बारे में अधिक पढ़ सकते हैं यदि आप उनके पीछे की अवधारणा को समझ नहीं पाते हैं।

नमस्कार प्रिय समुदाय

मैं पर्ल में एक sub बनाने की कोशिश कर रहा हूं जो कि एक हैश लेता है और एक डीबग झंडा है जो शून्य से चूकता है। हालांकि मुझे Odd number of elements in hash assignment यह त्रुटि हो रही है। अगर मैं डीबग ध्वज का उपयोग नहीं करता, तो यह काम करने लगता है।

पूरी सहायताके लिए शुक्रिया।

कोड:

#!/usr/bin/perl
use strict;
use warnings;
use Getopt::Long;
use POSIX qw(strftime);


#
#file2hash : read the file in k<file_name> e.g.=kconfig &  kmem  into hash table
#

sub file2hash {
    my ($file) = @_;

open(my $data, '<', $file) or die "Could not open '$file' $!\n";

my %HoH;
my $key;
my $value;
my $who;
my $rec;
my $field;

#while ( my $line = <$data>) {
while ( <$data>) {
    #print $line;
    next unless (s/^(.*?):\s*//); # / turn off editor coloring
    $who = $1;
    #print $who;
    $rec = {};
    $HoH{$who} = $rec;
    for $field ( split ) {
        ($key, $value) = split /=/, $field;
        $rec->{$key} = $value;
    }
}

    return %HoH;

}
#
#end file2hash
#


#
#print out hash table in k<file_name> format
#
sub hash2print{
    (my %HoH,my $debug) = @_;
    #my ($debug)[email protected]_||0;
    #my %HoH = shift;
    #my $debug = shift || 0;

    my $family;
    my $role;

    for $family ( keys %HoH ) {
        #print "$family\n";
        for $role ( keys %{ $HoH{$family} } ) {
             if ($debug){
                print "family:$family\n";
                print "role: $role\n";
             }
             print "$role=$HoH{$family}{$role}";

        }
        print "\n";
    }
}
#
#end hash2print
#

sub dispatch{

        my $inc= shift;
        my $config_f = shift || "kconfig";
        my $memory_f = shift || "kmem";

        my %h2=&file2hash($config_f);
        my %m2=file2hash($memory_f);

        my $today=&getDate();

        print "$today\n";
        print "$inc\n";
        my $inc_cnt = $m2{$today}{$inc} || -999999999;
        print "$inc_cnt\n";

        #my %config = shift;
        #my %mem = shift;
        #my $event = shift;
        #print $m2{$inc}{$today};
}

sub getDate{
my $date = strftime "%m/%d/%Y", localtime;  # "
#print $date;
return $date;
}

my %h2=&file2hash("kconfig");
my %m2=&file2hash("kmem");
&hash2print(%h2,1);
&hash2print(%m2,1);
#print &getDate();
#my $xcnt= &dispatch("event_c3_z2");
#&dispatch("event_c3_z2");
#print $xcnt;

टेस्ट फ़ाइल 1:

event_a1_x1: email1=[email protected].com email2=[email protected].com email1_cnt=6
event_a1_x2: email1=[email protected].com email2=[email protected].com email1_cnt=5 
event_b2_y1: email1=[email protected].com email2=[email protected].com email1_cnt=4 
event_b2_y2: email1=[email protected].com email2=[email protected].com email1_cnt=3 
event_c3_z1: email1=[email protected].com email2=[email protected].com email1_cnt=2 
event_c3_z2: email1=[email protected].com email2=[email protected].com email1_cnt=1

परीक्षण फ़ाइल 2:

201609230012: event_a1_x1=6
201609230744: event_a1_x2=5
201609230844: event_b2_y1=4
201609230342: event_b2_y2=3
201609230245: event_c3_z1=2
201609230100: event_c3_z2=1

तर्क एक समारोह के लिए एक फ्लैट सूची के रूप में पारित किया जाता है। दूसरी ओर, एक हैश को एक सूची सौंपी जा सकती है, %h = qw(ab) , जहां लगातार तत्व कुंजी-मूल्य जोड़े बनाते हैं, $h{a} है 'b' तो जब एक हैश पहला चर है जो एक फ़ंक्शन में तर्क प्राप्त करता है तो यह उन सभी को ऊपर निकालता है यहां एक हाल ही में पोस्ट है कि फ़ंक्शन कैसे लौटाता है , जहां सटीक समान कहानी लागू होती है।

तो सब कुछ हैश को सौंपा गया है, शेष स्केलर भी। इस प्रकार हैश का उद्देश्य से एक और तत्व प्राप्त होता है और तत्वों की एक अजीब संख्या के साथ समाप्त होता है।

एक समाधान - इस मामले में, केवल संदर्भ से हैश पास करने के लिए, जैसा कि नरक द्वारा उत्तर में

sub hash2print{
    my ($rHoH, $debug) = @_;
    my %HoH = %$rHoH;
    # ...
}
hash2print(\%h2, 1);

यह संदर्भ में सूचियों को पास करने के लिए सिद्धांत रूप से एक अच्छा विचार है, जब तक कि वे बहुत कम न हों।

सामान्य तौर पर आप पहले स्केलर को पास कर सकते हैं तो हैश

sub hash2print{
    my ($value, %HoH) = @_;
    # ...
}
hash2print(1, %h2);

लेकिन आपके मामले में यह नहीं है क्योंकि $debug वैकल्पिक है, और यदि हम फ़ंक्शन को कॉल करते हैं, तो इसे बाहर छोड़ दें, हैश की पहली कुंजी $value में समाप्त हो जाएगी

कुछ अन्य टिप्पणियां

  • विश्व का उपयोग न करें जब तक कि इसके लिए एक गैर-परक्राम्य कारण न हो। छोटे दायरे में घोषणा करें

  • आपको $rec = {}; करना नहीं है $rec = {}; , यह केवल my $rec; घोषित कर सकता है my $rec;

  • सामान्य तौर पर, फ़ंक्शन कॉल के सामने मत डालो, लेकिन केवल file2hash(...) उपयोग करें;





perl