我有由一个名称和两个数字组成的字符串。我想将名称和数字提取到一个变量中。我遇到的问题是某些名称中有空格。当我在 /\s+/ 上拆分时,名称被拆分成两个。
my (${st_name}, $val1, $val2) = split(/\s+/, $line, 3);
我尝试过在 /\d+/ 上进行拆分,但没有得到数字。我尝试过获取第一个数字的索引,但不确定是否真的
my $index = index ($line, \d);
我将非常感谢您的帮助。代码已试过
use strict;
use warnings;
while (my $line = <DATA>){
my (${st_name}, $val1, $val2) = split(/\s+/, $line, 3); #doesn't work
my $index = index ($line, \d);
${st_name}=$line(0, $index);
my ($val1, $val2) = $line($index)
__DATA__
Maputsoe 2 1
Butha-Buthe (Butha-Buthe District) 2 1
该表达式
/^(.*?)\s+(\d+)\s+(\d+)$/
应该有效。解释:
^(.*?)
:这将捕获姓名部分。这.*?
是非贪婪匹配,它将捕获直到第一位数字的所有内容\s+
:匹配一个或多个空格(\d+)
:捕获第一组数字\s+
:匹配一个或多个空格字符(\d+)$
:捕获行末的第二个数字序列您可以进行正则表达式匹配并捕获所需的部分。看起来您想要一些文本,然后是一个空格,然后是一个数字,更多空格,然后是另一个数字?
这将打印
正则表达式匹配一个或多个(
+
)字符(.
),后跟一个或多个空格(\s
),后跟\d
数字,然后再次匹配空格和数字。你的代码充满了废话。例如:
$st_name
很好,并且它所做的与没有什么不同${st_name}
。您不能使用
\d
不带引号的。这将变成错误。index
以字符串作为参数,因此您需要将其加引号。即"\d"
。但您不能将正则表达式与一起使用index
,只能使用字符串文字,并且\d
是正则表达式字符类。总而言之,这只是一团糟。用括号括住变量来让它执行某些操作的想法很奇怪,而且肯定不是 Perl 的惯用做法。Perl 的工作方式根本不是那样。
但是,您要做的事情可以用
index
和来完成substr
。但index
不能搜索正则表达式。因此,您必须改用模式匹配 和pos
。然后它看起来像这样:尽管更简单,但可以这样做:
当然你可以将其简化为
但我怀疑您的数据实际上是制表符分隔的,因为它看起来有点像。我可以通过将您的数据更改为包含制表符来准备我的代码,但遗憾的是 Stackoverflow 不会因为格式问题而将这些制表符保留在代码中。然后它看起来像这样:
并打印:
您可以尝试将此拆分语句与原始代码一起使用,看看其如何工作。