这是我要拆分的示例文本文件。
00:11:22:33:44:55(space)s8g6Dg9C11Dz97Fx(breakline)
XX:XX:XX:XX:XX:XX(space)XXXXXXXXxxxXXxXx
分割后,最后一行变为
s8g6Dg9C11Dz97Fx(breakline)
而不是
s8g6Dg9C11Dz97Fx(nothing).
但是
00:11:22:33:44:55 and XX:XX:XX:XX:XX:XX
没问题。
这是代码:
($mcaddr,$auth) = split / /;
我通过在行尾添加空格来解决这个问题。
答案 0 :(得分:0)
如果您的代码是:
open(tarrget, "<$ARGV[0]" ) or die "$!";
while (<tarrget>) {
chomp($_);
$target = $_; ## Not used...
( $mcaddr, $auth ) = split / /;
( $mcadd, $none ) = split / /;
$mcadd =~ s/[^a-zA-Z0-9]*//g;
}
我看到您在 $ _ 中使用了 split 两次,然后尝试删除$ mcadd变量中的非字母数字字符。
试试这个:
运行此perl-oneliner(管道&#34; |&#34;只是为了#34;澄清&#34;您的输出):
perl -nE&#39; chomp; ($ m,$ a)= split / \ s + /; $ m = ~s / [^ A-F0-9] // ig;说&#34; | $ m |&#34 ;;说&#34; | $ a |&#34;;&#39; mac.list
我的输出基于您的2个示例:
|001122334455|
|s8g6Dg9C11Dz97Fx|
||
|XXXXXXXXxxxXXxXx|
注意: XX:XX:XX:XX:XX:XX
不是十六进制有效(不是A-F,也不是0-9),而是在"$m =~ s/[^A-F0-9]//ig;"
对于那些不习惯Perl的s///
和RegExp ...的人:
[^A-F]
=&gt;不是A到F;
[^0-9]
=&gt;不是0到9;
i
修饰符代表&#34;忽略大小写&#34 ;;
g
修饰符代表&#34; global&#34 ;;
希望此片段/单行对您有用。
答案 1 :(得分:0)
我通过将代码更改为:
来解决问题open( tarrget, "<$ARGV[0]" ) or die "$!";
while (<tarrget>) {
chomp($_);
( $mcaddr, $none ) = split / /;
( $mcadd, $none ) = split / /;
( $none, $auth ) = split / /;
$mcadd =~ s/[^a-zA-Z0-9]*//g;