我有一个这样的文本文件
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;
你能帮助我吗?
这种替代
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
因为该字符串已被自身替换
我希望这有帮助
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句