永发信息网

perl查找

答案:2  悬赏:80  手机版
解决时间 2021-04-06 08:38
  • 提问者网友:雾里闻花香
  • 2021-04-05 08:58
perl查找
最佳答案
  • 五星知识达人网友:不想翻身的咸鱼
  • 2021-04-05 09:24
open SRC, "file.xml";
my $lastNode = ; # 这里假设了你第一行就是

while (my $line= ) {
if ( $line =~ /Value=\"([^\"]+)[\"]/ ) {
print "$lastNode\t$line" if $1 > 85
}
elsif ( $line=~ /^ $lastNode = $line;
}
}
close SRC;追问感谢大家的热心回答, 这个没有报错,不过也不显示任何内容。
追加:这段文件内容在文件中间,有很多段,这个只是一部分,有的可能有5行,6行,并不只是4行(A,B,C,D),也不会第一行就出现。追答open SRC, "file.xml" or die $!;
my $lastNode;
while ( ) {
if ( /^ $lastNode = $_;
last;
}
}
die "Can't find any Node start. Please check!" unless $lastNode;
while (my $line= ) {
if ( $line =~ /Value=\"([^\"]+)[\"]/ ) {
print "$lastNode\t$line" if $1 > 85
}
elsif ( $line=~ /^ $lastNode = $line;
}
}
close SRC;追问你好,热心的帮助者,运行你的程序有个error:
Can't find any Node start. Please check! at yy.pl line 11, line 738.
(我的数据文件只有738行。)我在相同的文件夹下建立了file.xml 运行的,对于原始发问的内容,还有一点要说明一下:如果没有Value>85 的数据,也就不显示上面得根节点,
)只有在根节点之间满足 Value>85 ,才显示本行以及上面的根节点,希望援手.追答我写的这个已经实测, 乎合你的要求, 但我估计你的文档并不是
将这句 : elsif ( $line=~ /^改写成: elsif ( $line=~ /
全部回答
  • 1楼网友:封刀令
  • 2021-04-05 10:43
代码来啦~

#!perl -w
#
my $limit = 85;
my $sourcefile = 'C:\Users\Administrator\Desktop\test.txt'; #源文件
my $targetfile = 'C:\Users\Administrator\Desktop\reslut.txt'; #结果

open(SOURCEHANDLE, $sourcefile);open(TARGETHANDLE, ">".$targetfile);
while ()
{
my $string = $_;
if($string =~ m/(?(?<=Value=")\d+)/)
{
if($+{tag} >= $limit)
{
print TARGETHANDLE $string;
}
}
else
{
print TARGETHANDLE $string;
}
}

close(SOURCEHANDLE);
close(TARGETHANDLE);
print "over", "\n";

看看是否可以. 希望对你有帮助!追问1.这个是输出目标行吗? 能输出它所在上面的根节点吗?
2.我准备好了环境,运行有点问题error:
Sequence (? ag>(?<=Value=")\d+)/
3.我现在找到一种方法能把目标行准确输出,也能找到它所在的行数,但是不能找到它上面的根节点.追答你用的perl版本多少?
估计是perl的版本问题。我用的V5.10.0

我这里边试了。可以很好的找出你要的结果。追问v5.8.0追答下个V5.10.0试下吧追问你好,由于周末没有环境,所有也没有时间来看,这个v5.8.0是别人提供的,我不能随便改,所以不好弄,你能再看看嘛,还有
if($string =~ m/(?(?<=Value=")\d+)/)
这个代码,由于版本的问题,我接触的不多,所以也不太明白一些符号的意思,比如 ~ 、?、等等,能再解释一下吗?追答5.8.8上跑过的代码。?()是指把匹配到的内容放到$+{tag}中,5.8.8好像不支持这个语法

my $limit = 85;
my $sourcefile = 'C:\Users\Administrator\Desktop\test.xml';
my $targetfile = 'C:\Users\Administrator\Desktop\reslut.xml';
open(SOURCEHANDLE, $sourcefile)||die"打开文件错误$!\n";;
open(TARGETHANDLE, ">".$targetfile);
while ()
{
my $string = $_;
if($string =~ m/((?<=Value=")\d+)/)
{
#print $1;
if($1 >= $limit)
{
print TARGETHANDLE $string;
}
}
else
{
print TARGETHANDLE $string;
}
}
close(SOURCEHANDLE);
close(TARGETHANDLE);
print "over", "\n";
有情况没????
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯