拆分空间变为第二个字符串中的断裂线

时间:2015-11-04 03:43:20

标签: perl

这是我要拆分的示例文本文件。

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 / /;

我通过在行尾添加空格来解决这个问题。

2 个答案:

答案 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变量中的非字母数字字符。

试试这个:

  1. 将您的内容放入名为&#34; mac.list&#34;;
  2. 的文件中
  3. 运行此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

  4. 我的输出基于您的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;