ホストファイルのドメイン名の非常に巨大なハーフミルエントリリストを並べ替える必要があります。しかし、サブドメインや.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の場合は3Perlで効率的なソートを行うための鍵は、値を変換して、辞書式にソートできる代表的な文字列に変換する関数を作成することです。
たとえば、日付を並べ替える場合は、日付を 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)、しかしそれはより大きなディストリビューションの一部です。