我想从一个数字后面拆分内容。
my $info = "8. 9 Run
Keywords :- RUN;
9. 10 spreadsheet
Keywords :- spreadsheet;
10. 11 Book
Keywords :- Book;
11. 15 Hide
Keywords :- Hide;
12. 132 Pick
Keywords :- Pick;
这是我根据8,9,10,11,12等数字分割内容的字符串。 任何建议如何在Perl中执行此操作并确保在吐出后不会出现像8.这样的数字。
答案 0 :(得分:2)
如果目标是通过 8.
拆分,9.
(等)
my @contents = grep { /./ } split /\d+\./, $info;
数组@contents
有9 Run ...
(最多9个)等,带有换行符和所有内容。 split中的模式/.../
是一个完整的正则表达式,当在字符串中匹配时,它被视为要拆分的分隔符。上面的正则表达式指定一个数字后跟一个句点,因此字符串被任何此类字符串拆分。
由于split
在这种情况下也会在第一次匹配(8.
)之前捕获(空字符串),我们使用grep来过滤掉空字符串,要求每个元素至少匹配一个字符。
您可能还希望选择更实质的过滤,例如使用grep { /\S/ }
,这要求每个元素至少有一个非空格,从而丢弃那些只有空格的过滤。
或者,您只能检查第一个元素
my @contents = split /\d+\./, $info;
shift @contents if $contents[0] eq '';
在显示的例子中,肯定会有一个空字符串。
最合适的方法通常取决于8.
之前的实际情况,您想要做什么,以及您想要对仅包含空格的可能元素做什么(例如来自{{1} }},甚至是空字符串(来自14. 15.
)。
如果目标是捕获 14.15.
,8.
(等),那么正则表达式会更好
9.
数组my @num_dot = $info =~ /(\d+\.)/g;
包含:@num_dot
答案 1 :(得分:2)
目前还不是很清楚你想要什么,但是分开数字似乎是一种很难完成任何事情的方法。
至少,您希望进行每个记录的更改和/或提取每个记录的信息,因此将数据拆分为记录会好得多。每条记录用空行分隔,因此我们可以使用
my @items = split /\n\n/, $info;
这给出了:
my @items = (
"8. 9 Run\n Keywords :- RUN;",
" 9. 10 spreadshee\n Keywords :- spreadsheet;",
" 10. 11 Book\n Keywords :- Book;",
" 11. 15 Hide\n Keywords :- Hide;",
" 12. 132 Pick\n Keywords :- Pick;",
);
现在,您似乎想删除这些数字。
s/^\s*\K\d+\.\s*// for @items; # Preserves the leading whitespace.
s/^\s*\d+\.\s*// for @items; # Removes the leading whitespace.
后者给出:
my @items = (
"9 Run\n Keywords :- RUN;",
"10 spreadshee\n Keywords :- spreadsheet;",
"11 Book\n Keywords :- Book;",
"15 Hide\n Keywords :- Hide;",
"132 Pick\n Keywords :- Pick;",
);
您可以使用
重建$info
减去数字
$info = join("\n\n", @items);
这给出了:
9 Run
Keywords :- RUN;
10 spreadshee
Keywords :- spreadsheet;
11 Book
Keywords :- Book;
15 Hide
Keywords :- Hide;
132 Pick
Keywords :- Pick;
如果这不能回答您的问题,请说明您对示例的期望输出。