[英]how to replace a matched line in a file in perl?
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);
**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后缺少一行。 谁能解决这个问题。
调试Perl程序的基本规则是打开strict
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
,那将是您立即看到的错误。
我还必须提到,您没有检查“ testing.txt”是否已打开。 这不会引起您的问题,但这是Perl中最常见的错误之一,因此值得一提。
open FH, "+<testing.txt";
这里也不必使用+<
,因为您仅将其用于阅读。 最后,我建议您使用词法文件句柄而不是全局glob,因为它们在超出范围时会自动关闭。
稍后,请检查是否打开了其他文件,但不包括$!
它将告诉您为什么无法打开。
通常,只需使用autodie
。 如果失败,这将使(几乎)每个IO操作都抛出格式正确的错误消息。 比必须记住到处写下“或死……”要好得多。
use autodie;
open my $fh, "<", "testing.txt";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.