/ /ホストファイルをサフィックス(.com.whatever)またはプレフィックス(サブドメイン)ではなくTLDドメインでソート-perl、sorting、unix、ターミナル

ホストファイルをサフィックス(.com.whatever)またはプレフィックス(サブドメイン)ではなくTLDドメインで並べ替える-perl、並べ替え、unix、ターミナル

ホストファイルのドメイン名の非常に巨大なハーフミルエントリリストを並べ替える必要があります。しかし、サブドメインや.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に解決されるため、後で追加します)ドメインだけがリストに含まれています。brewを搭載したMacを使用しているため、GNUまたはnixツールを使用できますそれ。前もって感謝します!

回答:

回答№1の場合は3

Perlで効率的なソートを行うための鍵は、値を変換して、辞書式にソートできる代表的な文字列に変換する関数を作成することです。

たとえば、日付を並べ替える場合は、日付を 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、10、2ではなく1、2、10)。私たちの主要な機能はそれを処理できますが、置き換えることで簡単な方法をとります 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);
}

を使用して主要な機能を実装する IO :: Socket :: SSL :: 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

IO :: Socket :: SSL :: PublicSuffix おそらくより頻繁に更新されます ドメイン:: PublicSuffix (そして Mozilla :: PublicSuffix)、しかしそれはより大きなディストリビューションの一部です。