0
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

4 回答 4

2

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

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

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

于 2013-06-12T22:11:23.100 回答
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
于 2013-06-14T07:42:33.937 回答
0

尝试 :

if ( $input =~ /(=)(.+)(\[)(.+)(\])/ ) { 
   @array=($2,$4);
}    
于 2013-06-12T23:36:47.917 回答
0

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

if( $input =~ /(\S+)\s*=\s*(\S+)\s*\[\s*(\S+)\s*\]/ ) {
    @array = ($2,$3);
}
于 2013-06-12T23:56:39.297 回答