【问题标题】:Substitute a sentence of a text, with the corresponding sentence of another text using Perl用 Perl 替换一个文本的句子,用另一个文本的对应句子
【发布时间】:2014-04-14 22:15:07
【问题描述】:

我有一个这样的文本文件

mc1s2  L#'|NA|det indice|indice|nc Sensex|NA|adj
progressait|progresser|v de|de|prep

还有这样的文件文本

programmer:_[1]_:_P0_(P1)=1 progresser:_[1]_:_P0=1 
prohiber:_[1]_:_P0_P1=1
projeter:_[3]_:_P0_P1=1;_:_P0_P1_(PL)=1;_:_P0_P1_(PP<sur>)=1

我想进行替换以创建像这样的第三个文件文本

mc1s2  L#'|NA|det indice|indice|nc Sensex|NA|adj
progresser:_[1]_:_P0=1 de|de|prep As you can see I'd like to replace
progressait|progresser|v with progresser:_[1]_:_P0=1. 

我想对所有动词都这样做。

这个脚本回答了我的迫切要求,但我无法理解它的最后一部分

use strict;
use warnings;
use autodie;

my $lookupfile = 'lookup.txt';
# Contains:
# programmer:_[1]_:_P0_(P1)=1
# progresser:_[1]_:_P0=1 
# prohiber:_[1]_:_P0_P1=1
# projeter:_[3]_:_P0_P1=1;_:_P0_P1_(PL)=1;_:_P0_P1_(PP<sur>)=1

my $datafile = 'data.txt';
# Contains:
# mc1s2  L#'|NA|det indice|indice|nc Sensex|NA|adj progressait|progresser|v de|de|prep 

my %lookup;
open my $fh, '<', $lookupfile;
while (<$fh>) {
    chomp;
    my ($field) = split ':';
    $lookup{$field} = $_;
}

# use Data::Dump; # Used to debug the lookup table.
# dd \%lookup;

open $fh, '<', $datafile; while (<$fh>) {
    s{(?<=\s)(\S+)} {
        my $entry = $1;
        my @fields = split '\|', $entry;
        $lookup{$fields[1]} // $entry;
    }eg;

    print;
}

我无法理解:

open $fh, '<', $datafile;
while (<$fh>) {
    s{(?<=\s)(\S+)}{
        my $entry = $1;
        my @fields = split '\|', $entry;
        $lookup{$fields[1]} // $entry;
    }eg;

你能帮帮我吗?

【问题讨论】:

  • 这是我一周前提供给另一个问题的代码。我会建议您简单地在评论中回复该答案,但由于某种原因,stackoverflow 上不再存在该问题。烦人:/
  • 为此我再次编写了代码!非常感谢您的帮助! :)

标签: regex perl hashtable substitution


【解决方案1】:

这个替换

s{(?<=\s)(\S+)}{
    my $entry = $1;
    my @fields = split '\|', $entry;
    $lookup{$fields[1]} // $entry;
}eg;

使用/e修饰符,表示不直接使用替换字符串,而是执行作为Perl代码生成替换匹配的字符串。

  • 匹配找到紧跟空格字符的下一个非空格字符序列,因此在这种情况下,$1 最初设置为L#'|NA|det

  • $1 被复制到$entry$entry 在管道字符| 上被拆分为@fields

  • %lookup 哈希用 $fields[1] 索引 - @fields 中的第二个条目。这是字符串NA

  • 代码块返回该哈希元素的值,或者如果没有带有该键的哈希元素,则返回整个 $entry。请注意,因为$entry 是整个匹配字符串,所以除非在%lookup 中找到对应元素,否则不会发生任何变化,因为字符串被替换为自身

希望对你有帮助

【讨论】:

  • @user3025314:不是真的。你有什么问题?
  • 如何打印 final.txt 中所有文本文件的结果?替换保存在哪里?如果我只写“打印输出”;什么都没有打印出来;
  • @user3025314:我不明白你所说的“所有文本文件”是什么意思。您在问题中只提到了一个查找文件和一个数据文件。我认为您需要问另一个问题,尽可能多地显示真实数据以及您想要的输出。
  • @user3025314:你了解 Perl 吗? print OUT 将尝试将$_ 的值打印到文件句柄OUT。它还表明您没有有效的use strictuse warnings,因为后者会警告您文件句柄已关闭。
  • @user3025314 它应该将所有行按原样打印到 STDOUT。因此,在您的控制台上调用 perl script.pl &gt; resultFile.txt 应该可以满足您的需求。我还想提一下:很好的答案。
猜你喜欢
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-21
  • 2016-03-11
  • 2018-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多