Способы сделать этот код поиска и замены лучше? - PullRequest
0 голосов
/ 16 октября 2019

У меня есть этот код

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

my %map;
open my $MAP, '<', 'full_links' or die $!;
while (<$MAP>) {
    my ($key, $value) = /comments\/(.*)\/(.*)\//;
    $map{$key} = "$key/$value";
}

open my $IN, '<', 'html_links' or die $!;
open my $out, '>', "results" or die;
while (<$IN>) {
    s/comments\/(.*)"/comments\/$map{$1}\/"/g;
    print $out $_;
}
close $out;

, который изменяет строки в файле html_links

с <a href="https://reddit.com/r/subreddit/comments/CODE/">title</a>

на <a href="https://reddit.com/r/subreddit/comments/CODE/title_of_the_post/">title</a>

путем просмотрав файле full_link он заполнен такими строками:

https://reddit.com/r/subreddit/comments/CODE/title_of_the_post/

Но я чувствую, что это выглядит немного странно. В частности, часть $map{$key} = "$key/$value"; и ее дальнейшее использование при замене. Я чувствую, что достаточно просто сделать $map{$key} = $value, но я не знаю, как его использовать для замены, которая мне нужна.

1 Ответ

0 голосов
/ 17 октября 2019

Я бы сделал это с Mojo :: DOM . Пусть он найдет все теги A, а затем изменит значения их значений HREF:

#!perl
use v5.14;

use Mojo::DOM;
use Mojo::URL;

my $html = <<'HERE';
<html>
<body>

<a href="https://reddit.com/r/subreddit/comments/CODE/">Some title</a>
<a href="https://example.com/">Leave alone</a>
<a href="https://reddit.com/r/subreddit/comments/CODE/">Other title</a>

</body>
</html>
HERE

# Create the Document object model
my $dom = Mojo::DOM->new($html);

$dom
    # find all the A tags in the HTML with CSS selectors
    # The ^= matches just the HREFs that start with that text
    ->find( 'a[href^=https://reddit.com/]' )
    ->map( sub {
        # take the slug from the text between the A opener and closer.
        # replace whitespace (or whatever) with underscores
        my $slug = lc($_->text) =~ s/\s+/_/gr;

        # add the slug to the last part of the URL's path
        my $url = Mojo::URL->new( $_->attr('href') );
        push $url->path->parts->@*, $slug;

        # give the HREF its new value
        $_->attr('href', $url)
        })
    ;

# The DOM now has the modified HTML
say $dom
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...