使用Perl Split Operator分割带22-前缀的记录,如何保留前缀?
解决Perl分割保留记录前缀的问题
有两种可行的方法,不用事后手动逐个加前缀:
方法一:用零宽度正向预查分割(直接保留前缀)
Perl的split支持用正则的零宽度断言作为分割位置,这种断言不会消耗匹配到的字符,所以能把22-留在每个记录的开头。
具体用/(?=22-)/作为分割正则,它的作用是匹配所有紧跟在22-前面的位置,分割后每个元素都会自然带上开头的22-。注意如果文件开头不是22-,会生成一个空字符串,用grep过滤掉就行。
代码示例:
open my $fh, '<', 'large_file.txt' or die $!; local $/; # 一次性读取整个大文件(若文件超大可考虑逐行处理,这里先按整读逻辑) my $content = <$fh>; close $fh; # 分割并过滤空元素 my @records = grep { length } split /(?=22-)/, $content;
方法二:分割后批量补前缀(更直观)
如果对零宽度正则不太熟悉,也可以先按22-分割,得到不带前缀的记录内容,再批量给每个元素加上22-。同样要注意过滤分割后产生的空字符串(比如文件开头的非记录内容)。
代码示例:
open my $fh, '<', 'large_file.txt' or die $!; local $/; my $content = <$fh>; close $fh; # 分割后过滤空元素,再补前缀 my @records = map { "22-$_" } grep { length } split /22-/, $content;
两种方法都能达到目的,第一种一步到位,第二种逻辑更直白,根据自己的习惯选择即可。
内容的提问来源于stack exchange,提问作者Bob6739
相关产品推荐
相关产品推荐

