Perl查询最短算法
我有一个文本文件,类似于: aaa bbb_ccc ddd ee_ff gg hh i j kk l aaa mm_nn_o p qq rr ss_t aaa uu_lfpr lkl dde ldk_tr_lp 文件2 aaa bbb_ccc ddd ee_ff gg hh i j kk l aaa mm_nn_o p qq rr ss_t aaa毫米 p qq rr ss\t file3 aaa uu_lfpr lkl dde ldk_tr_lp aaa uu_lfpr lkl dde ldk_tr_lpPerl查询最短算法,perl,Perl,我有一个文本文件,类似于: aaa bbb_ccc ddd ee_ff gg hh i j kk l aaa mm_nn_o p qq rr ss_t aaa uu_lfpr lkl dde ldk_tr_lp 文件2 aaa bbb_ccc ddd ee_ff gg hh i j kk l aaa mm_nn_o p qq rr ss_t aaa毫米 p qq rr ss\t file3 aaa uu_lfpr lkl dde ldk_tr_lp aaa uu_lfpr lkl dde ld
有没有什么简短的算法可以用来实现这一点?我不想使用标志或开关来做这件事,并使一个漫长的代码。我想知道是否有任何函数或任何内置子例程可以用更短的代码实现这一点 这里有几个草图,直到一些代码显示出来,我可以根据需要详细说明 要点:不需要旗帜。只需在每次匹配时打开一个新文件
my ($cnt, $fh_out);
while (<$fh_input>) {
if (/^\s*aaa/) {
++$cnt;
open $fh_out, '>', "file$cnt.txt" or do { warn $!, next };
}
print $fh $_;
}
my($cnt,$fh_out);
而{
如果(/^\s*aaa/){
++$cnt;
打开$fh_out,'>',“file$cnt.txt”或执行{warn$!,next};
}
打印$fh$;
}
打开文件句柄时,如果文件句柄已打开,则会先将其关闭,这样以前的写入操作是安全的,并且会打开一个新文件
或者,如果您希望使用一行正则表达式来解析输入文件
my $content = do { local (@ARGV, $/) = $filename; <> };
my @blocks = $content =~ /(aaa (?: (?!aaa). )+ )/sxg;
for my $i (0..$#blocks) {
open my $fh, '>', 'file'.($i+1).'.txt' or do { warn $!, next };
print $fh $blocks[$i];
}
my$content=do{local(@ARGV,$/)=$filename;};
我的@blocks=$content=~/(aaa(?(?!aaa)。+)/sxg;
对于我的$i(0..$#块){
打开我的$fh、'>'、'文件'($i+1)。'.txt'或执行{warn$!,next};
打印$fh$块[$i];
}
我的最短:
my $n = 1; # File number
while (<>) {
open (STDOUT, '>', 'file' . $n++) if /^aaa/;
print;
}
my$n=1;#文件号
而(){
如果/^aaa/,则打开(标准输出“>”,“文件“$n++”);
印刷品;
}
或使用拆分
use strict;
use warnings;
use feature 'say';
my $data = do { local $/; <> };
my @array = split(/(?=(?:aaa))/,$data);
my $count = 1;
for (@array) {
open STDOUT , '>' , 'file' . $count++;
print;
}
使用严格;
使用警告;
使用特征“说”;
my$data=do{local$/;};
my@array=split(/(?=(?:aaa))/,$data);
我的$count=1;
for(@array){
打开标准输出“>”和“文件”。$count++;
印刷品;
}
注:
打开标准输出,'>',文件'$计数++
借用了--simple approach为match定义正则表达式,将整个文件读入变量(如果文件不是太大),将正则表达式match捕获到数组中,为数组的每个元素打开自己的文件并将数组的元素转储到文件中。如果没有看到您的代码,就不需要任何帮助。谢谢大家抽出时间。