从一个文件串中提取特定文本,以便使用Strawberry Perl进行比较

时间:2015-04-24 16:27:25

标签: regex perl

我使用Strawberry Perl(64位)5.20.1.1-64bit来执行文本替换。我在perl脚本的位置下面有几个.txt文件。我想要做的是匹配关键字" id:"在任何文件(即Player7.txt)中,从字符串中提取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
}

请帮忙。感谢

2 个答案:

答案 0 :(得分:0)

你还没有在你的程序附近显示任何关于上下文的想法,但这应该有所帮助。它只读取一个播放器文件,因为你不能说出你想要对它们做什么,但总体思路应该有效。您更有可能应该使用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;
}

答案 1 :(得分:-1)

这可能就是你想做的事情:

#!/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]