मुझे एक होस्ट फ़ाइल में डोमेन नामों की सुपर विशाल अर्ध-सैन्य प्रविष्टियों की सूची को सॉर्ट करने की आवश्यकता है। लेकिन मैं उन्हें उप-डोमेन या .com .net द्वारा सॉर्ट नहीं करना चाहता।
तो यह:
www.apple3.com
this.apple4.com
that.apple1.uk
and.that.apple2.com.br
इस में बदल जाएगा:
that.apple1.uk
and.that.apple2.com.br
www.apple3.com
this.apple4.com
इस सूची में अभी तक कोई ips नहीं है (जैसा कि सभी 0.0.0.0 को हल करेंगे, मैं "बाद में जोड़ दूंगा") सूची में केवल डोमेन। मैं "एक का उपयोग कर रहा हूँ MAC काढ़ा, इसलिए मैं किसी भी GNU या nix उपकरण का उपयोग कर सकता हूं यह। अग्रिम में धन्यवाद!
उत्तर:
जवाब के लिए 3 № 1पर्ल में कुशल छँटाई की कुंजी एक फ़ंक्शन बनाने के लिए है जो मान को प्रतिनिधि स्ट्रिंग में सॉर्ट करने के लिए बदल देती है जिसे लेक्सिकोग्राफ़िक रूप से सॉर्ट किया जा सकता है।
उदाहरण के लिए, यदि आप तिथियों को क्रमबद्ध करना चाहते हैं, तो आप उन्हें में बदल सकते हैं yyyymmdd
प्रारूप। इस स्थिति में, हम "डोमेन के भागों को फिर से व्यवस्थित करेंगे"
foo.bar.apple1.co.uk
निम्नलिखित में से एक बन जाता है:
# Using this approach, the sorted order of apple1.com and apple1.net will vary.
apple1.bar.foo
32
# Using this approach, the sorted order of apple1.com and apple1.net will be consistent.
apple1.bar.foo<NUL>uk.co
हम चाहते हैं कि संख्या स्वाभाविक रूप से क्रमबद्ध हो, (1, 2, 10 के बजाय 1, 10, 2)। हमारा मुख्य कार्य इसे संभाल सकता है, लेकिन हम "प्रतिस्थापित करके आसान रास्ता निकालेंगे।" sort
साथ में natkeysort
से क्रमबद्ध करें :: कुंजी :: प्राकृतिक। एक बोनस के रूप में, natkeysort
हमें आसानी से हमारे प्रमुख कार्य को एकीकृत करने की अनुमति देता है!
प्रत्यय की पहचान के लिए कठिन हिस्सा है। उसके लिए कोई नियम नहीं है, बस लगातार बदलती परिभाषाएँ। जैसे, हम "प्रत्यय की पहचान करने के लिए एक मॉड्यूल का उपयोग करेंगे।
का उपयोग करते हुए प्रमुख फ़ंक्शन को लागू करना डोमेन :: PublicSuffix:
use feature qw( state );
use Domain::PublicSuffix qw( );
sub get_sort_key {
my ($host) = @_;
$host =~ s/.z//;
state $dps = Domain::PublicSuffix->new();
$dps->get_root_domain($host)
or die "$host: ".$dps->error();
my @name = split /./, substr($host, 0, -length($dps->suffix())-1);
my @suffix = split /./, $dps->suffix();
return join(".", reverse @name)." ".join(".", reverse @suffix);
}
का उपयोग करते हुए प्रमुख फ़ंक्शन को लागू करना आईओ :: सॉकेट :: एसएसएल :: PublicSuffix:
use feature qw( state );
use IO::Socket::SSL::PublicSuffix qw( );
sub get_sort_key {
my ($host) = @_;
my @host = split(/./, $host);
state $ps = IO::Socket::SSL::PublicSuffix->default();
my ($name, $suffix) = $ps->public_suffix(@host);
return join(".", reverse @$name)." ".join(".", reverse @$suffix);
}
उपरोक्त कार्यों का उपयोग निम्नानुसार किया जाता है:
use feature qw( say );
use Sort::Key::Natural qw( natkeysort );
my @hosts = (
"www.apple3.net",
"www.apple3.com",
"this.apple4.com",
"that.apple4.com",
"www.apple10.com",
"that.apple1.uk",
"and.that.apple2.com.br",
);
my @sorted_hosts = natkeysort { get_sort_key($_) } @hosts;
say for @sorted_hosts;
आउटपुट:
that.apple1.uk
and.that.apple2.com.br
www.apple3.com
www.apple3.net
that.apple4.com
this.apple4.com
www.apple10.com
आईओ :: सॉकेट :: एसएसएल :: PublicSuffix माना जाता है कि इससे अधिक बार अपडेट किया जाता है डोमेन :: PublicSuffix (तथा मोज़िला :: PublicSuffix), लेकिन यह एक बड़े डिस्ट्रो का हिस्सा है।