मेरे पास एक हैश है जिसमें सरणी की एक सूची है और मुझे उस सरणी से एक अनूठी सूची प्राप्त करनी है। लेकिन जब मैं आईडी करने की कोशिश कर रहा हूं तो मुझे कोई त्रुटि या अनूठी सूची नहीं मिल रही है।

नोट: मैं किसी मॉड्यूल का उपयोग नहीं करना चाहता

नीचे मेरे हैश की नमूना संरचना है जिसमें सरणी है:

'15445' => { 'str' => {
                        'TOKEN' => [
                           'HC',
                           'HC',
                           'HC',
                           'HC',
                           'HC',
                           'HC'
                            ]
                }
        }

मैं सरणी TOKEN से मूल्यों की एक अनूठी सूची प्राप्त करने के लिए कैसे प्रयास कर रहा हूं

foreach my $id (keys %$client) {
    my @unique_srp_id;
    @unique_srp_id = uniq($hash->{$id}->{str}->{TOKEN});
    print @unique_srp_id;
}

sub uniq {
    my %seen;
    grep !$seen{$_}++, @_;
}

क्या कोई मुझे सुझाव दे सकता है कि मैं यहाँ क्या गलत कर रहा हूँ।

0
Developer 12 फरवरी 2019, 00:18

2 जवाब

सबसे बढ़िया उत्तर

आप फ़ंक्शन के मानों वाला एक सरणी संदर्भ पास कर रहे हैं, लेकिन फ़ंक्शन सीधे @_ में मानों की अपेक्षा कर रहा है।

my @unique = uniq(@{$hash->{$id}{str}{TOKEN}});

पर्ल 5.24+ पर, आप इसे थोड़ा अच्छा दिखने के लिए पोस्टडेरेफ का उपयोग कर सकते हैं (शायद?)

my @unique = uniq($hash->{$id}{str}{TOKEN}->@*)

पर्ल 5.26+ पर, List::Util का मुख्य संस्करण uniq फ़ंक्शन को समाहित करने के लिए पर्याप्त नया (1.45) है और यह आपके शुद्ध-पर्ल संस्करण से तेज़ होगा और undef मानों को स्पष्ट रूप से संभालेगा।

4
Grinnz 12 फरवरी 2019, 00:24

uniq एक सूची की अपेक्षा करता है लेकिन $hash->{$id}->{str}->{TOKEN} एक सरणी संदर्भ (एकल तत्व) है। या तो एक सरणी पास करें uniq

 uniq(@{$hash->{$id}{str}{TOKEN}})

या एक सरणी संदर्भ की अपेक्षा करने के लिए uniq लिखें

sub uniq {
    my %seen;
    grep !$seen{$_}++, @{$_[0]};
}
2
mob 12 फरवरी 2019, 00:25