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;
**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一行之后。任何人都可以解决这个问题。
答案 0 :(得分:1)
调试Perl程序的基本规则是turn on strict
and warnings
。 strict
强制您声明所有变量以避免拼写错误,因此它们不是全局的。 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";