local_addr = sjcapp [value2]
如何拆分此字符串以便在数组中得到2个值,即
array[0] = sjcapp
和array[1] = value2
。
如果我这样做
@array = split('local_addr =', $input)
然后我的array[0]
有sjcapp [value2]
。我希望能够在我的split
函数本身中将它分成两部分。
我正在尝试这样的事情,但它不起作用:
split(/local_addr= \s/, $input)
答案 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);
}