代码:
$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
my ($a, $mac, $b) =
split('/([0-9A-F]{2}[:-]){5}([0-9A-F]{2})/', $_);
print $mac;
print "\n";
出于某种原因$mac
总是空的,我不知道为什么。
答案 0 :(得分:2)
如果你提供split
字符串作为第一个参数,它将在该字符串上拆分,就像它是一个正则表达式一样。
split ':', $str;
真的是DWIM:
split /:/, $str;
所以你的代码:
split('/([0-9A-F]{2}[:-]){5}([0-9A-F]{2})/', $_);
真的意味着
split(m[/([0-9A-F]{2}[:-]){5}([0-9A-F]{2})/], $_);
# or
split(/\/([0-9A-F]{2}[:-]){5}([0-9A-F]{2})\//, $_);
您还希望split
保存匹配的值,因此您希望整个匹配位于()
。
$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
my ($a, $mac, $b) = split(/((?:[0-9A-F]{2}[:-]){5}[0-9A-F]{2})/, $_);
print $mac, "\n";
由于您似乎只使用$mac
,因此您不必使用split
。
my ($mac) = /((?:[0-9A-F]{2}[:-]){5}[0-9A-F]{2})/;
# or
my @macs = /((?:[0-9A-F]{2}[:-]){5}[0-9A-F]{2})/g;
答案 1 :(得分:1)
首先你需要删除正则表达式周围的“'”,它不应该在那里。 然后,如果您希望将整个拆分字符串作为结果,则需要将整个拆分表达式括在括号内。
$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
my ($a, $mac, $b) =
split(/(([0-9A-F]{2}[:-]){5}([0-9A-F]{2}))/, $_);
print $mac;
print "\n";
答案 2 :(得分:1)
这比split
简单。你可以匹配:
$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
$_ =~ /(([0-9A-F]{2}[:-]){5}([0-9A-F]{2}))/;
print $1;
答案 3 :(得分:1)
如果您只需要MAC地址,那么
$_ = "Sample sentence with 00-B0-D0-86-BB-F7 MAC address in the middle";
/((:?[a-fA-F0-9]{2}[:-]){5}[a-fA-F0-9]{2})/;
print "$1\n";
答案 4 :(得分:0)
split
期望一种模式与您要提取的MAC地址分开的模式匹配。您没有将MAC地址与其他内容分开,因此split
不适合在此处使用。你想要匹配运算符。
my ($mac) = /((?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2})/;
或者,如果您想从同一个字符串中提取多个地址:
my @macs = /(?:[0-9A-Fa-f]{2}[:-]){5}[0-9A-Fa-f]{2}/g;
split
的一个例子是:
my @bytes = split /[:-]/, $mac;