/ / TLD डोमेन की मेजबानों की फाइल, प्रत्यय (.com.whatever) या उपसर्ग (उप-डोमेन) द्वारा क्रमबद्ध न करें - पर्ल, सॉर्टिंग, यूनिक्स, टर्मिनल

TLD डोमेन द्वारा होस्ट होस्ट फ़ाइल को प्रत्यय (.com.whatever) या उपसर्ग (उप-डोमेन) द्वारा क्रमबद्ध करें - पर्ल, सॉर्टिंग, यूनिक्स, टर्मिनल

मुझे एक होस्ट फ़ाइल में डोमेन नामों की सुपर विशाल अर्ध-सैन्य प्रविष्टियों की सूची को सॉर्ट करने की आवश्यकता है। लेकिन मैं उन्हें उप-डोमेन या .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), लेकिन यह एक बड़े डिस्ट्रो का हिस्सा है।