Regex 使用Perl从一个文件字符串中提取用于比较的特定文本
我正在使用草莓Perl(64位)5.20.1.1-64位来执行文本替换。在perl脚本的位置下面有几个.txt文件。我试图做的是匹配任何文件(即Player7.txt)中的关键字“id:”,并从字符串中提取id_PlayerXX以在另一个文件中进行比较。字符串将如下所示: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
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+)
。这很有效!我仍在努力理解正则表达式,但只是需要练习。非常感谢。