如何在perl文件中替换匹配的行?

时间:2016-02-03 05:09:01

标签: regex perl perl-data-structures



open FH, "+<testing.txt";
$keyField = "PPD6";
@searchList = qw(PPD6	16-Dec-15	Base5	no	Yes	g_<<date>>	No	No	"N4,Q2");
$fieldNumber = 3; 
$valueToSet = "Ravitej";
splice @searchList, $fieldNumber,1, $valueToSet;
my @lines=<FH>;
open(FILE,">foo.txt")|| die "can't open file for write\n";
foreach $line (@lines) {
    if($line =~ /$keyField/) {
        print FILE $searchList;
    } else {
        print FILE $line;
    }
}#end foreach
close(FH);
close(FILE);
&#13;
&#13;
&#13;

**Inputs:
**
PPD5    31-Dec-15   Basel5  No  No      
PPD5    23-Dec-15   Bas_15  No  No      
PPD6    16-Dec-15   Bas3_15 No  No
NPD5    16-Dec-15   Bas15   No  No
NPD6    16-Dec-15   Bas15   No  No
PARU    9-Jan-16    hjfhg15 No  No



OUTPUT:


PPD5    31-Dec-15   Basel5  No  No      
PPD5    23-Dec-15   Bas_15  No  No      
PPD6    16-Dec-15   Bas3_15 Ravitej No
NPD6    16-Dec-15   Bas15   No  No
PARU    9-Jan-16    hjfhg15 No  No

我的问题是在缺少PPD6一行之后。任何人都可以解决这个问题。

1 个答案:

答案 0 :(得分:1)

调试Perl程序的基本规则是turn on strict and warningsstrict强制您声明所有变量以避免拼写错误,因此它们不是全局的。 warnings会警告你可能存在错误的事情。

在使用-w打开警告后,我们会立即看到问题。

$ perl -w ~/tmp/test.plx
Possible attempt to separate words with commas at /Users/schwern/tmp/test.plx line 3.
Name "main::searchList" used only once: possible typo at /Users/schwern/tmp/test.plx line 11.
Use of uninitialized value $searchList in print at /Users/schwern/tmp/test.plx line 11, <FH> line 6

您打印$searchList但没有这样的变量。如果您有strict,那么您可能会立即看到错误。

我还要提到你未能检查&#34; testing.txt&#34;打开。这不会导致您的问题,但这是Perl中最常见的错误之一,因此值得指出。

open FH, "+<testing.txt";

此处也不必使用+<,因为您仅使用它进行阅读。最后,我建议使用词法文件句柄而不是全局globs,因为它们会在超出范围时自动关闭。

稍后您会检查其他文件是否打开,但不要包含$!,它会告诉您无法打开的原因。

一般情况下,只需使用autodie即可。这将使(几乎)每个IO操作在失败时抛出格式良好的错误消息。比记得写'#34;或死...更好...&#34;无处不在。

use autodie;

open my $fh, "<", "testing.txt";