如何使用perl脚本在文件中的特定位置插入行

时间:2019-03-18 03:38:34

标签: perl

这是我的问题,我试图读取HTML文件(index.html),然后搜索所有链接,然后将其放在名为salida.html的第二个文件中,我读了this answer,我读了此答案,我尝试这样做,但是对我来说不起作用。 这是我的perl代码:

use strict;
use warnings;
use 5.010;
use Tie::File;

my $entrada='index.html';
my $salida='salida.html';
open(A,"<$entrada");
my @links;  
foreach my $linea (<A>){
    print "Renglon => $linea\n" if $linea =~ m/a href/;
    #print $B $linea if $linea =~ m/a href/;
    push @links, $linea if $linea =~ m/a href/;
}

tie my @resultado, 'Tie::File', 'salida.html' or die "Nelson";
for (@resultado) {
    if ($_ =~ m/<main class="contenido">/){
        foreach my $found (@links){
            $_ .= '<br/>'.$found;
        }
        last;
    }
}
close(A);

我的Perl代码运行没有问题,但是在我的代码中,我试图在salida.html文件的特定部分中写入变量$ links中的链接:

<!DOCTYPE html>
<html lang="es-mx">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Resultados de la busqueda</title>
    <link rel="stylesheet" href="style-salida.css">
</head>

<body>
    <div class="contenedor">
        <header class="header">
            <h2>Resultados de la busqueda</h2>
        </header>
        *<main class="contenido">

        </main>*
        <footer class="footer">
            <h4>
                Gerardo Saucedo Arevalo - 15092087 - Topicos selectos de tecnologias web - Búsqueda de enlaces dentro de
                una página web
            </h4>
        </footer>
    </div>
</body>

</html>

但是我的代码总是在文件末尾添加行,我只运行了一次该代码,并且效果很好,但是随后我添加了几行,而当我尝试再运行一次时却没有用。 我恢复了文件的工作状态,但此文件不再工作。 我在做什么错了?

1 个答案:

答案 0 :(得分:0)

始终使用适当的解析器处理HTML或XML,然后对DOM进行处理。我的解决方案使用HTML::TreeBuilder。由于您的问题不包含index.html的内容,因此我在解决方案后附加了自己的内容:

#!/usr/bin/perl
use warnings;
use strict;

use HTML::TreeBuilder;

# Extract links from <DATA>
my $root1 = HTML::TreeBuilder->new->parse_file(\*DATA)
    or die "HTML: $!\n";

my @links = $root1->look_down(_tag => 'a');

# Process salida.html from STDIN
my $root2 = HTML::TreeBuilder->new;
$root2->ignore_unknown(0);
$root2->parse_file(\*STDIN)
    or die "HTML: $!\n";

# insert links in correct section
if (my @nodes = $root2->look_down(class => 'contenido')) {
    $nodes[0]->push_content(@links);
}

print $root2->as_HTML(undef, '  '), "\n";

# IMPORTANT: must delete manually
$root2->delete;
$root1->delete;

exit 0;

__DATA__
<!DOCTYPE html>
<html>
  <head>
    <title>test</title>
  </head>
  <body>
    <div>
      <a href="link1.html">Link 1</a>
      <a href="link2.html">Link 2</a>
    </div>
  </body>
</html>

试运行:

$ perl dummy.pl <dummy.html
<!DOCTYPE html>
<html lang="es-mx">
...
 <main class="contenido"> <a href="link1.html">Link 1</a><a href="link2.html">Link 2</a></main> 
...
</html>