【问题标题】:Perl: Can a string be converted to vector flagPerl:可以将字符串转换为矢量标志
【发布时间】:2020-01-09 07:01:50
【问题描述】:

我一直在寻找一种方法来遍历 Ip 范围,我遇到了这个 response

sub inc_ip { $_[0] = pack "N", 1 + unpack "N", $_[0] }
my $start = 1.1.1.1;
my $end = 1.10.20.30;
for ( $ip = $start; $ip le $end; inc_ip($ip) ) {
    printf "%vd\n", $ip;
}

我想知道是否有办法将my $start = "192.168.1.1"; 之类的字符串转换为矢量标志。当我传递一个字符串时,我得到的是一些随机数

【问题讨论】:

  • 我不明白这个 "vector flag" 你得到一些 "random numbers" 是什么意思。而且我在您的代码中看不到任何与此描述匹配的内容。从您的问题中不清楚您期望发生什么以及您会得到什么。
  • 我不知道你想要什么“矢量标志”。请展示您期望该程序产生什么。
  • 没有“转换为矢量标志”。这个“矢量标志”是printf 的修饰符(“标志”),用于以特定方式打印给定值。我仍然不知道你希望你的程序产生什么。
  • Socket::inet_aton("1.2.3.4") 为您提供二进制表示 - 这可能是您想要的(不要忘记 use Socket;)。
  • 您的代码有点棘手,因为您的 $start$end 变量是版本字符串,它们在 perl 中带有一些魔力...

标签: perl


【解决方案1】:
pack 'C*', split /\./, $s

或者专门针对 IPv4,

use Socket qw( inet_aton );

inet_aton($s)

例如,您可以使用

use Socket qw( inet_aton );

my $start = unpack('N', inet_aton('1.1.1.1'));
my $end   = unpack('N', inet_aton('1.10.20.30'));

for my $ip ($start..$end) {
   printf("%vd\n", pack('N', $ip));
}

【讨论】:

  • 添加到我的答案中。
猜你喜欢
  • 2011-02-20
  • 1970-01-01
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 2021-05-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-18
相关资源
最近更新 更多