2013-06-12 67 views
0
local_addr = sjcapp [value2] 

让我在阵列即 array[0] = sjcapparray[1] = value2得到2个值你如何拆分此字符串。拆分一个Perl字符串子串和一个空格

如果我这样做

@array = split('local_addr =', $input) 

然后我array[0]sjcapp [value2]。我希望能够在我的split函数本身中将它分成两部分。

我是想这样的事情,但它没有工作:

split(/local_addr= \s/, $input) 

回答

2

未经检验的,但也许这样的事情?

@array = ($input =~ /local_addr = (\S+)\s\[(\S+)\]/); 

而不是split,这里采用在列表上下文一个正则表达式的匹配,它给你在括号中捕获的部分的阵列。

+0

由于文件具有一致的结构,不会使用“split”比大型数据集的正则表达式更快更简单吗?我在下面的回应中使用过'''awk'''样式的perl“autosplit”,但'''sed'''或'''cut'''也可以。当然perl具有便携性的优势:-) –

+0

我认为这是在Perl脚本中,而不是使用Perl作为命令行处理器,但我现在看到它可以是。我还认为'['和']'是字面值,需要丢弃,这使得在某些时候需要使用正则表达式。我怀疑,除非该文件是巨大的,否则性能将成为一个问题,所以一个TMTOWTDI的例子,我想:) – IMSoP

0

尝试:

if ($input =~ /(=)(.+)(\[)(.+)(\])/) { 
    @array=($2,$4); 
}  
0

我会用一个正则表达式,而不是分裂,因为这显然是一个标准格式的配置文件行。如何构建正则表达式可能取决于完整的行语法以及您想要的灵活性。

if($input =~ /(\S+)\s*=\s*(\S+)\s*\[\s*(\S+)\s*\]/) { 
    @array = ($2,$3); 
} 
1
~/ cat data.txt  
    local_addr = sjcapp [value2] 
    other_addr = superman [value1492] 
    euro_addr = overseas [value0] 

如果数据真的如定期为结构化的,那么你可以拆分的空白。在命令行(见perlrun(1)手册页),这是最简单的用“自动分割”(-a),它奇迹般地创造字段的数组称为@F从输入:

perl -lane 'print "$F[2] $F[3]" ' data.txt 
sjcapp [value2] 
superman [value1492] 
overseas [value0] 

在你的脚本,你可以更改名称阵列,并且所述元件的内,它由shift -ing或splice -ing位置 - 可能在比这更优雅的方式 - 但它的工作原理:

perl -lane 'my @array = ($F[2],$F[3]) ; print "$array[0], $array[1]" ' data.txt 

或者,在不使用自动分割,如下所示:

perl -lne 'my @arr=split(" ");splice(@arr,0,2); print "$arr[0] $arr[1]"' data.txt