使用子字符串和空格拆分perl字符串

时间:2013-06-12 22:06:18

标签: perl

local_addr = sjcapp [value2]

如何拆分此字符串以便在数组中得到2个值,即 array[0] = sjcapparray[1] = value2

如果我这样做

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

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

我正在尝试这样的事情,但它不起作用:

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

4 个答案:

答案 0 :(得分:2)

未经测试,但也许是这样的?

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

而不是split,它在列表上下文中使用正则表达式匹配,它为您提供括号中捕获的部分数组。

答案 1 :(得分:1)

~/ cat data.txt    
  local_addr = sjcapp [value2]
  other_addr = superman [value1492]
  euro_addr = overseas [value0]

如果数据确实是那样的规则结构,那么你可以只分割空白。在命令行上(参见perlrun(1)手册页)这对于“autosplit”(-a)来说是最简单的,它可以从输入中神奇地创建一个名为@F的字段数组:

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

在您的脚本中,您可以更改数组的名称,以及元素的位置,通过shift - 或splice - 可能以比此更优雅的方式更改 - 但是它有效:

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

或者,不使用autosplit,如下:

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

答案 2 :(得分:0)

尝试:

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

答案 3 :(得分:0)

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

if( $input =~ /(\S+)\s*=\s*(\S+)\s*\[\s*(\S+)\s*\]/ ) {
    @array = ($2,$3);
}