2015-11-04 98 views
1

我的代码:的Perl增加结肠000000000000

#!/usr/bin/perl 

$macaddress = "000000000000"; 

print "$macaddress\n"; # Now how to make it 00:00:00:00:00:00 

如何使之成为00:00:00:00:00:00?

enter image description here

+3

不要以root身份编码。 – zb226

+0

为什么?如果im代码在root模式下会发生什么? –

+0

要解释[这个答案](http://askubuntu.com/a/16179):你可以打破东西糟糕。 – zb226

回答

3

这将做到这一点:

print join (":", $macaddress =~ m/(\d{2})/g); 

我们使用的 “两位数” 正则表达式匹配。我们重复它,所以匹配返回每个两位数的元素列表。然后它在:

不过,如果你正在处理十六进制数字,这是行不通的 - 你需要处理的信件,以及:

my $macaddress = "c0ffeedeAD02"; 
print join (":", lc($macaddress) =~ m/([0-9a-f]{2})/gi); 

,它将打印:

c0:ff:ee:de:ad:02 

(中lc降低一切)。

注 - 此技术匹配任意成对数字,并忽略其他任何内容。所以你可以很乐意做到这一点:

$macaddress = "c0-ff-ee-de-AD-02"; 
$macaddress = "c0:ff:ee:de:AD:02"; 
$macaddress = "c0XffJee*de&AD!02"; 

它加入一个指定的分隔符。您可以使用另一个(或无):

$macaddress = "c0XffJee*de&AD!02"; 
print join ("", lc($macaddress) =~ m/([0-9a-f]{2})/gi); 
#still prints: c0ffeedead02 
+0

谢谢,它完美的作品。 –

+0

如何在00:00:00:00:00:00删除冒号? –

+0

'@addr = split(':',$ str);打印@addr;'将删除冒号。 – serenesat

1

另一种选择是代替做

my $macaddress = "000000000000"; 
$macaddress =~ s/(?<=\d{2})(\d{2})/:$1/g; 
print $macaddress; 

如果要分开两个任意字符使用

~s/(?<=..)(..)/:$1/g; 

谢谢你@glenn jackman :)

+1

为了避免必须砍:'$ macaddress =〜s /(?<=..)(..)/:$ 1/g' –

+0

@glennjackman谢谢你的有用的评论文章编辑:) – mkHun

0

你也可以使用substr

for (my $pos = 2; $pos < length $macaddress; $pos += 3) { 
    substr $macaddress, $pos, 0, ':'; 
}