Perl-匹配文件中的开始/结束字符串

Perl-匹配文件中的开始/结束字符串,perl,match,Perl,Match,如何为以下内容编写PERL: 我想读一个文件 然后从读取的文件中匹配游戏和结束。我想把有“好渔获量1515”的钓线变成“好渔获量11030”。最后的数字是乘以2、3或4…等等 打印出相同的文件,但上面更改了 #我不知道如何匹配$GOOD CATCH line并乘以最后4位。perl中有LINDEX或SCAN这样的东西吗? 打开(infle,“,”outputfile.txt“)或死“无法打开:$!”; 而() 如果(/GAME/){ 如果(/BALL X1/){ $GOOD CATCH

如何为以下内容编写PERL:

  • 我想读一个文件

  • 然后从读取的文件中匹配游戏和结束。我想把有“好渔获量1515”的钓线变成“好渔获量11030”。最后的数字是乘以2、3或4…等等

  • 打印出相同的文件,但上面更改了

#我不知道如何匹配$GOOD CATCH line并乘以最后4位。perl中有LINDEX或SCAN这样的东西吗?
打开(infle,“,”outputfile.txt“)或死“无法打开:$!”;
而()
如果(/GAME/){
如果(/BALL X1/){
$GOOD CATCH=
}
}
elseif(/END){
印刷品;
}
关闭(inffie);
关闭(输出文件);

我建议您看看类似的解析器。无论如何,这里有一个使用正则表达式的更简单方法:

use strict;
use warnings;

my $fn = "file.txt";
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my $str = do { local $/; <$fh> };
close $fh;
$str =~ s/^(GAME.*?^END)/multiply($1)/msge;
print $str;


sub multiply {
    my ( $str ) = @_;

    $str =~ s/(GOOD CATCH.*?;)/_multiply($1)/ge;
    return $str;
}


sub _multiply {
    my ( $str ) = @_;

    $str =~ s/(\d+)/_mul_number($1)/ge;
    return $str;
}

sub _mul_number {
    my ($num) = @_;

    return $num * 2;
}

我建议您看看类似的解析器。无论如何,这里有一个使用正则表达式的更简单方法:

use strict;
use warnings;

my $fn = "file.txt";
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my $str = do { local $/; <$fh> };
close $fh;
$str =~ s/^(GAME.*?^END)/multiply($1)/msge;
print $str;


sub multiply {
    my ( $str ) = @_;

    $str =~ s/(GOOD CATCH.*?;)/_multiply($1)/ge;
    return $str;
}


sub _multiply {
    my ( $str ) = @_;

    $str =~ s/(\d+)/_mul_number($1)/ge;
    return $str;
}

sub _mul_number {
    my ($num) = @_;

    return $num * 2;
}

非常感谢。所以,如果你想打印成一个文件。您是否只是打开一个输出文件并打印$outfilename而不是$str?我想用“更新的倍增行”打印整个文件。是的,你可以这样做。或者简单地重定向shell中的输出:
perl prog.pl>output.txt
也许您可以将您尝试过的代码发送给我?(我的电子邮件在我的个人资料中)。然后我会看一看。嗨,我还需要匹配“球X1”。我该如何输入代码?所以,开始和结束是(比赛和结束),然后它将匹配(球X1)和(好的接球)?是的,你可以做到!我没有收到你的电子邮件谢谢。所以,如果你想打印成一个文件。您是否只是打开一个输出文件并打印$outfilename而不是$str?我想用“更新的倍增行”打印整个文件。是的,你可以这样做。或者简单地重定向shell中的输出:
perl prog.pl>output.txt
也许您可以将您尝试过的代码发送给我?(我的电子邮件在我的个人资料中)。然后我会看一看。嗨,我还需要匹配“球X1”。我该如何输入代码?所以,开始和结束是(比赛和结束),然后它将匹配(球X1)和(好的接球)?是的,你可以做到!我没有收到你的电子邮件yetTip:语言的名称是“Perl”,而不是“Perl”。它不是一个首字母缩略词:语言的名称是“Perl”,而不是“Perl”。这不是首字母缩略词
# I am not sure how to match $GOOD CATCH line and multiply the last 4 digit. Is there such a thing as LINDEX or SCAN in perl?

open (infile, "<", "inputfile.txt") or die "could not open:$!";
open (outfile, ">", "outputfile.txt") or die "could not open:$!";


while (<infile>)
     if (/GAME/) {
         if (/BALL X1/) {
            $GOOD CATCH = 
         }
      }
     elseif (/END) {
     print ;
     }

close (inffie);
close (outfile);
use strict;
use warnings;

my $fn = "file.txt";
open ( my $fh, '<', $fn ) or die "Could not open file '$fn': $!";
my $str = do { local $/; <$fh> };
close $fh;
$str =~ s/^(GAME.*?^END)/multiply($1)/msge;
print $str;


sub multiply {
    my ( $str ) = @_;

    $str =~ s/(GOOD CATCH.*?;)/_multiply($1)/ge;
    return $str;
}


sub _multiply {
    my ( $str ) = @_;

    $str =~ s/(\d+)/_mul_number($1)/ge;
    return $str;
}

sub _mul_number {
    my ($num) = @_;

    return $num * 2;
}
GAME
     BALL X1 ;
     GOOD CATCH 2 10 30 10 30 ;
END