Perl按位并给我时髦的结果

Sam*_*Sam 8 ip perl parsing bit-manipulation

我正在编写一个perl脚本来比较使用perls按位AND运算符的两个IP地址.但我得到了一些非常时髦的结果.我是perl的新手所以也许有人可以给我一些指示.

继承我的小脚本:

#!/usr/bin/perl

$address = "172.34.12.0";
$address2 = "255.255.255.0";

@octets = split (/\./,$address);
@octets2 = split (/\./,$address2);

#Funky results when doing a bitwise AND
#This outputs "050 24 00 0" What's going on here?
print $octets[0] & $octets2[0], "\n";
print $octets[1] & $octets2[1], "\n";
print $octets[2] & $octets2[2], "\n";
print $octets[3] & $octets2[3], "\n";

#Results are what I want when doing it as literals
#This outputs "172 34 12 0"
print 172 & 255, "\n";
print 34 & 255, "\n";
print 12 & 255, "\n";
print 0 & 0, "\n";
Run Code Online (Sandbox Code Playgroud)

任何人都知道为什么或如何在$ octets和$ octets2成员上进行按位AND时得到"050 24 00 0"?当我按位和使用文字时,一切似乎都工作得很好.请帮忙.谢谢!

Jac*_*ers 13

按位运算对字符串和数字的作用不同,并split返回字符串.使用0+或将字符串转换为数字int.http://codepad.org/sqHntIgZ:

#!/usr/bin/perl

$address = "172.34.12.0";
$address2 = "255.255.255.0";

@octets = split (/\./,$address);
@octets2 = split (/\./,$address2);

#Funky results when doing a bitwise AND
#This outputs "050 24 00 0" What's going on here?
print int($octets[0]) & int($octets2[0]), "\n";
print int($octets[1]) & int($octets2[1]), "\n";
print int($octets[2]) & int($octets2[2]), "\n";
print int($octets[3]) & int($octets2[3]), "\n";

#Results are what I want when doing it as literals
#This outputs "172 34 12 0"
print 172 & 255, "\n";
print 34 & 255, "\n";
print 12 & 255, "\n";
print 0 & 0, "\n";
Run Code Online (Sandbox Code Playgroud)

  • print int($ octets [$ _])&int($ octets2 [$ _]),"\n"for(0..3); 让我们至少在这里得到一点点... (3认同)

Bil*_*ert 6

我建议您使用CPAN模块,例如Net :: IP.

也总是把使用严格; 使用警告; 在你的程序的顶部.


hob*_*bbs 6

如果你不打算使用像Net :: IP或Net :: Netmask这样的CPAN模块,至少要使用一些给你的工具:

use strict;
use warnings;
use Socket;

my $address = "172.34.12.123";
my $address2 = "255.255.255.0";

my $raw_masked = inet_aton($address) & inet_aton($address2);
my $masked = inet_ntoa($raw_masked);
print $masked, "\n";
Run Code Online (Sandbox Code Playgroud)

或更简洁,简单地说:

use Socket;
print inet_ntoa(
  inet_aton("127.34.12.123") 
  & inet_aton("255.255.255.0") 
), "\n";
Run Code Online (Sandbox Code Playgroud)


TLP*_*TLP 5

这是一个可爱的快速版本:

my $address  = 172.34.12.0;
my $address2 = 255.255.255.0;
my @a = map ord, split //, $address & $address2;
say for @a;
Run Code Online (Sandbox Code Playgroud)

要克服字符串化的V字符串:

my $address  = eval "172.34.12.0";
my $address2 = eval "255.255.255.0";
Run Code Online (Sandbox Code Playgroud)


Tom*_*ych 4

你没有转换成数字。您将各个字符进行 AND 运算。