我正在编写一个脚本,它需要打开文件转到特定行并插入一个字符串。这段代码适用于我创建的txt文件和htm文件,但是当我尝试在真正的htm文件上使用它时,我的字符串就会被添加到文件的底部。必须省略实际的字符串和文件位置。我知道有一些问题模块可以让这更容易,但我试着在走这条路之前自己学习如何做。
open( my $in, "</Users/bal/Desktop/hold/r.txt" ) or die $!;
open( my $out, "+>/Users/bal/Desktop/hold/sr.txt" ) or die $!;
while (<$in>) {
print $out $_;
last if $. == 8;
}
my $liner = <$in>;
$liner = "ball\nball\n";
print $out $liner;
while (<$in>) {
print $out $_;
}
答案 0 :(得分:2)
如果您尝试在第9行插入,但发现该脚本只是附加,则很可能您的行结尾是针对另一个系统。
要检查文件的行结尾,可以尝试以下命令:
perl -MData::Dumper -e '$Data::Dumper::Useqq = 1; print Dumper scalar <>;' file
如果您发现它们不正确,您可以使用以下方法修复它们:
perl -i -pe 's|\R|\n|g' file
但是,就HTML而言,行号和行结尾有些不相关。
相反,您应该使用像Mojo::DOM
这样的实际HTML解析器来解析html文件并插入文本。有用的8分钟介绍性视频,您可以查看Mojocast Episode 5。
以下演示了在最后一个h2
之后插入一个段落:
use strict;
use warnings;
use Mojo::DOM;
my $dom = Mojo::DOM->new( do {local $/; <DATA>} );
$dom->at('h2:last-of-type')->append("\n<p>INSERTED - Paragraph ZERO</p>");
print $dom->to_string();
__DATA__
<html>
<head>
<title>Inserting a line</title>
</head>
<body>
<h1>Hello World</h1>
<p>Header one - Paragraph one</p>
<p>Header one - Paragraph two</p>
<p>Header one - Paragraph three</p>
<h2>What's up world?</h2>
<p>Header two - Paragraph one</p>
<p>Header two - Paragraph two</p>
<p>Header two - Paragraph three</p>
<h2>Goodbye world</h2>
<p>Header three - Paragraph one</p>
<p>Header three - Paragraph two</p>
<p>Header three - Paragraph three</p>
</body>
</html>
输出:
<html>
<head>
<title>Inserting a line</title>
</head>
<body>
<h1>Hello World</h1>
<p>Header one - Paragraph one</p>
<p>Header one - Paragraph two</p>
<p>Header one - Paragraph three</p>
<h2>What's up world?</h2>
<p>Header two - Paragraph one</p>
<p>Header two - Paragraph two</p>
<p>Header two - Paragraph three</p>
<h2>Goodbye world</h2>
<p>INSERTED - Paragraph ZERO</p>
<p>Header three - Paragraph one</p>
<p>Header three - Paragraph two</p>
<p>Header three - Paragraph three</p>
</body>
</html>
答案 1 :(得分:0)
看起来你的测试数据中的行号。您是否考虑使用正则表达式将额外的行粘贴在文本文件中?
请记住,实时htm文件的实时编号可能与您使用的数据不同。而是考虑使用如下模式:
$value = "ball\n";
$newValue = "ball\nball\n";
$line = s/$value/$newvalue
将这段代码粘贴到您逐行处理的循环中。然后只需打印$ out $ line,用新的“ball \ nball \ n”替换“ball \ n”的实例。通过使用正则表达式,您应该避免在实时数据中计算行数的麻烦。
你可以在这里阅读yon perl正则表达式: https://www.cs.tut.fi/~jkorpela/perl/regexp.html
还有一本关于正则表达式的书,我强烈推荐。 http://www.abebooks.com/Mastering-Regular-Expressions-Powerful-Techniques-Perl/13660633427/bd?cm_mmc=gmc--gmc--PLA-_-v01
也就是说,在使用正则表达式解析htm文件时要非常谨慎。 杰夫阿特伍德写了一篇令人信服的论点,说明它可以获得多么混乱。 http://blog.codinghorror.com/parsing-html-the-cthulhu-way/
如果您打算做的不仅仅是替换几行,您可能需要查看预定义的库。