それについて何が不十分に書かれていますか?より良い var 名を使用できますが、それが可能かどうかはわかりません (中間ステップには名前を付けられる品質がないように見えるため) split
。疑似コードはほぼ一語一語翻訳です。
$a = $ARGV[0];
$a =~ s/[^A-F0-9]+//simg;
@b = reverse split /(\S{2})/,$a;
$c = join "", @b;
$c .= "0000";
$d = hex($c) % 999999929;
print "$d\n";
する必要があります
$a = $ARGV[0]; # Get a hex str from cmd line E3:C9:D4
$a =~ s/[^A-F0-9]+//simg; # Remove any non-hex digits E3C9D4
@b = reverse $a =~ /(..)/sg; # Extract "bytes"; reverse D4, C9, E3
$c = join "", @b; # Join them. D4C9E3
$c .= "0000"; # Append two NULs D4C9E30000
$d = hex($c) % 999999929; # Convert from hex to number and modulus
print "$d\n"; # Print the result (in decimal).
少し明確:
$a = $ARGV[0];
$a =~ s/[^0-9A-Fa-f]+//g;
$a = join '', reverse $a =~ /(..)/sg;
$a .= "0000";
$a = hex($a);
$a %= 999999929;
print "$a\n";
これらのスニペットにはバグがある可能性があります。32 ビット整数の Perl ではhex
、入力に 4 桁以上の 16 進数があるとオーバーフローします。64 ビットの整数を持つ Perl は、12 桁の 16 進数を処理します。
ここからコードを取得したようです。入力として MAC アドレスを受け取ることを意図しています。つまり、コードが機能するには 64 ビット整数またはMath::BigIntが必要です。64ビット値をモジュラスにしたいので、それを回避する方法はありません。
64 ビット整数の Perl でのみ動作する簡潔な方法を次に示します。
my $mac = $ARGV[0];
$mac =~ s/[^0-9A-Fa-f]+//g;
die length($mac) != 12;
# "123456789ABC" => 0xBC9A785634120000
my $hash = unpack('Q<', pack('H*', "0000$mac"));
$hash %= 999999929;
print "$hash\n";
移植性のために、Math::BigInt を以前のバージョンに統合した方がよいでしょう。