繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM