使用Perl扩展数组中的缩写?

时间:2014-02-20 18:35:21

标签: regex arrays perl variables scope

我不确定是否可以这样做,或者至少我正在尝试这样做。在此先感谢,如果在其他地方得到解答,请对不起。我已经尝试了几种不同的脚本,没有成功,现在这就是我所拥有的。请原谅任何糟糕的语法/草率代码,我是Perl的新手 -

#!/usr/bin/perl
use strict;

my $file1 = "testShort.txt";
open(FH, "< $file1") or die "Can't open $file1 for read: $!";
my @Array;
while (<FH>) {
  push(@Array, $_);
}
close FH or die "Cannot close $file1: $!";

# spelling out abbreviations
# opening text files of abbreviations and full text
my $file3 = "abbr.txt";
open(FH, "< $file3") or die "Can't open $file3 for read: $!";
my @abbr;
while (<FH>) {
  push(@abbr, $_);
}
close FH or die "Cannot close $file1: $!";

my $file4 = "full.txt";
open(FH, "< $file4") or die "Can't open $file4 for read: $!";
my @full;
while (<FH>) {
  push(@full, $_);
}
close FH or die "Cannot close $file4: $!";

# attempt to expand abbreviations throughout array
my $k = 0;
foreach (@Array) {
  while ($k < @Array) {
    $_ =~ s/ $abbr[$k] | $abbr[$k]. /$full[$k] /;
    $k++;
  }
}

print @Array;

我实际上有单独的代码在命令行接受“shortTest.txt”,并且将来我将使用此代码作为另一个脚本的一部分,从命令行对多个文本文件运行它,尽管我不认为这会有所作为吗?。

我有正则表达式,因为我想要它没有变量,并且在while循环之外(简单部分...)因为我已经阅读越来越多我认为我只是在做一些逻辑错误如何循环,并需要完全不同的代码,并且就变量而言,我已经查了100次,试过s / \ Q @var \ E / \ Q $ var2 \ E /等等。

任何帮助表示赞赏,我可能花了几个小时阅读并想出来,我计划很快,但是现在,我希望得到一些帮助

---只是通过这个来说谢谢你对这个伟大的社区的帮助,我希望在其他一些方面我可以尝试并回馈,也许最终帮助解决基本的Perl问题

1 个答案:

答案 0 :(得分:1)

很少有东西,使用词法文件句柄而不是类型globs。请务必选择数据,特别是如果您要使用它来搜索和替换。你不太可能想要翻译先生\ n - &gt;先生\ n但实际上先生 - &gt;先生。

之后,创建单个正则表达式来执行搜索和替换是有利的,因此您没有clobber以前的更改。将边界条件添加到正则表达式可能是明智的,这样就不会替换单词的中间部分。希望这有助于至少解决您的代码中的一些问题:

#!/usr/bin/perl

use strict;
use warnings;

my $abbrevfile = 'abbr.txt';
my $fullfile = 'full.txt';
my $datafile = 'testShort.txt';

open my $abbrevfh, $abbrevfile or die "Can't open $abbrevfile: $!";
my @abbrevs = <$abbrevfh>;
chomp(@abbrevs);
close $abbrevfh;

open my $fullfh, $fullfile or die "Can't open $fullfile: $!";
my @fulls = <$fullfh>;
chomp(@fulls);
close $fullfh;

# Build translation regex and hash;
if (@abbrevs != @fulls) {
    die "Data mismatch.  abbrevs and full must be same length\n";
}
my $abbrev_re = join '|', map {"\Q$_\E\.?"} @abbrevs;
my %trans = ();
@trans{@abbrevs} = @fulls;

open my $datafh, $datafile or die "Can't open $datafile: $!";
while (<$data$fh>) {
    s/\b($abbrev_re)\b/$trans{$1}/g;
    print;
}