有什么不好写的?它可以使用更好的 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
如果输入的十六进制数字超过四个,则会溢出。具有 64 位整数的 Perl 将处理 12 个十六进制数字。
您似乎已从此处获取代码。这意味着将 MAC 地址作为输入,这意味着代码需要 64 位整数或Math::BigInt才能工作。没有办法解决它,因为您想对 64 位值取模。
这是一种只适用于 64 位整数的 Perls 的简洁方法:
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 集成到早期版本中。