【发布时间】:2013-10-27 17:37:19
【问题描述】:
我正在尝试获取文件 INPUT,如果该文件中的一行包含一个字符串,则将该行替换为其他内容(整行,包括换行符),或者什么都不替换(删除该行不在那里)。将所有这些写入一个新文件。
这是那段代码...
while(<INPUT>){
if ($_ =~ / <openTag>/){
chomp;
print OUTPUT "Some_Replacement_String";
} elsif ($_ =~ / <\/closeTag>/) {
chomp;
print OUTPUT ""; #remove the line
} else {
chomp;
print OUTPUT "$_\r\n"; #print the original line
}
}
while(<INPUT>) 应该一次读取一行(如果我的理解正确的话)并将每一行存储在特殊变量$_
但是,当我运行上面的代码时,我只得到第一个 if 语句条件返回 Some_Replacement_String,而且只有一次。 (1 行,来自 1.3m 的文件,预计有 600,000 次替换)。这显然不是我所期望的行为。如果我执行while(<INPUT>){print OUTPUT $_;) 之类的操作,我会得到整个文件的副本,每一行,所以我知道整个文件正在被读取(预期行为)。
我想做的是得到一条线,测试它,用它做点什么,然后继续下一条。
如果它有助于故障排除,如果我在该 while 语句(或之后)的任何地方使用 print $.;,我会得到 1 返回。我希望这是“最后访问的文件句柄的当前行号。”。所以当我的 while 语句遍历整个文件时,它应该等于文件中的行数,而不是 1。
我已经尝试了此代码的其他一些变体,但我认为这是我最接近的。我认为我没有得到我期望的行为是有充分理由的,谁能告诉我这是什么?
【问题讨论】:
-
你能检查以下几行的输出吗?
@lines = <INPUT>; print scalar @lines; -
@jkshah = 它返回了一个,直到我在这里给出了一些其他提示来修复它。
标签: perl