Regex 使用Perl从一个文件字符串中提取用于比较的特定文本

Regex 使用Perl从一个文件字符串中提取用于比较的特定文本,regex,perl,Regex,Perl,我正在使用草莓Perl(64位)5.20.1.1-64位来执行文本替换。在perl脚本的位置下面有几个.txt文件。我试图做的是匹配任何文件(即Player7.txt)中的关键字“id:”,并从字符串中提取id_PlayerXX以在另一个文件中进行比较。字符串将如下所示: id: ID_Player7 // Unique ID player_ids.txt文件包含我计算所需的实际值。此文件的格式如下: #define ID_Player7

我正在使用草莓Perl(64位)5.20.1.1-64位来执行文本替换。在perl脚本的位置下面有几个.txt文件。我试图做的是匹配任何文件(即Player7.txt)中的关键字“id:”,并从字符串中提取id_PlayerXX以在另一个文件中进行比较。字符串将如下所示:

            id: ID_Player7         // Unique ID
player_ids.txt文件包含我计算所需的实际值。此文件的格式如下:

#define ID_Player7        236
现在我需要匹配找到的播放器,并提取与该播放器相关的实际数值(本例中为236)

我遇到的问题是只删除了“Player7”部分以用于替换

我想应该是这样的

$id_player_file =~ s/(ID_Player\d\d)//;
if ($defined_id =~ m/$id_player_file/) {
   $extracted_value =~ s/$_/\d\d\d$/;
   # $extracted_value calculation here and written to individual player file
}

请帮忙。谢谢

您还没有展示足够的程序来了解上下文,但这应该会有所帮助。它只读取一个播放器文件,因为你没有说你想用它们做什么,但总体思路应该是可行的。更可能的情况是,您应该从
player_ids.txt
的内容中构建一个哈希结构,但不可能仅用这些信息来建议您

如果您需要更多帮助,请显示您的程序和数据文件

use strict;
use warnings;
use 5.010;
use autodie;

open my $player_fh, '<', 'Player7.txt';
open my $ids_fh, '<', 'player_ids.txt';

while ( <$player_fh> ) {

  next unless /^\s*id:\s*(\w+)/;

  my $id_player_file = $1;

  while ( <$ids_fh> ) {
    next unless /^\s*#define\s+$id_player_file\s+(\d+)/;

    my $extracted_value = $1;
    ...
    last;
  }

  last;
}
使用严格;
使用警告;
使用5.010;
使用自动模具;

打开我的$player_fh,“可能这就是你想要做的:

#!/usr/bin/perl

my $id_player_file = "            id: ID_Player7         // Unique ID" ;
my $defined_id     = "#define ID_Player7        236"                   ;   

$id_player_file =~ s/.*\bid: (\w+\d+).*/\1/;
printf "id_player_file=[%s]\n", $id_player_file; # print "ID_Player7"

my $extracted_value = undef;

# Check whether ['ID_Player7'+whitespaces+number] exist $defined_id
if ( $defined_id =~ m/$id_player_file\s+(\d+)/ ) { 
    # If yes, retrieve the number after whitespaces (inside parentheses above)
    $extracted_value = $1; 
}

printf "extracted_value=[%s]\n", $extracted_value;
注:
\d+
表示一个或多个数字,
\s+
表示一个或多个空格

输出:

id_player_file=[ID_Player7]
extracted_value=[236]

在上面的示例中,
$id\u player\u文件
$extracted\u value
变量中您期望/需要什么值?从示例中,我需要$id\u player\u文件为“id\u Player7”,而$extracted\u值应为“236”。底线是提取的_值对于玩家来说是唯一的,因此每个人的计算都会不同。希望我的解释不要太混乱。谢谢你的描述不清楚。听起来好像
$defined_id
是来自
player_id.txt
的值,您想将其与来自player文件的值进行比较,如
Player7.txt
?但是播放文件中没有可比较的数字-它只是说
id:id\u Player7//Unique id
。请让我道歉,因为我对这东西还很陌生。我将试着详细阐述一下;如果在“Player###.txt”中找到了“id:”,则从该字符串中拉出播放器id名称(即-->id:id\u Player7//唯一id行,应生成$var1=“id\u Player7”)。接下来,如果在“Player_ids.txt”中找到$var1,则找到分配给Player7的数值(即-->#define ID_Player7 236行,结果应该是$var2=236)。希望这有助于澄清我的问题,再次感谢你的帮助。我想这已经接近我想要的了。唯一的问题是,在字符串“id:id\u Player7//Unique id”中,Player7可以是任何名称的组合(即id\u Blue25、Green01、Flyer36等)。因此,这可能需要对替换进行一些调整,更新我的答案以覆盖“任意id:”。如果您只需要影响包含
id:id\uu
,即不包括
id:FOO
等的字符串,只需将
(\w+\d+)
替换为
(id\w+\d+)
。这很有效!我仍在努力理解正则表达式,但只是需要练习。非常感谢。