2017-04-08 5 views
-1

An dieser Stelle verwende ich zwei Perl-Skripte, um eine Textdatei in das gewünschte Format zu konvertieren. Ein Perl-Skript lädt eine Datei mit der API aus dem Web herunter, speichert sie als Datei und druckt dann nur die IP-Adressen (zB ips.txt) - dann leite ich die Ausgabe in eine andere Textdatei (zB perl script1.pl> ips2.txt)). Die gedruckte Ausgabe sieht wie folgt aus:Kombinieren Sie zwei Perl-Skripte

222.187.221.224 
222.187.221.250 
222.187.239.35 
222.187.239.136 
222.215.230.79 
222.215.230.85 

Das zweite Skript nimmt die Datei, die ich geschaffen, um die IP-Adressen in folgendem Format zu ändern:

("222.187.239.35" OR "222.187.239.136" OR "222.215.230.79" OR "222.215.230.85") 

Meine Frage ist, wie kann ich am effizientesten diese beiden kombinieren Perl-Skripte in eins, um alle erforderlichen Aktionen durchzuführen? Die Dateierstellung ist unnötig, es ist nur die einzige Möglichkeit, wie ich es bisher geschafft habe. Hilfe wird sehr geschätzt.

erstes Drehbuch:

#/usr/bin/perl 

use strict; 
use warnings; 
use LWP::Simple; 
use Regexp::Common qw/net/; 

getstore("https://<redacted>", "ips.txt"); 


open(my $input, "<", "ips.txt"); 

while (<$input>) { 
    print $1, "\n" if /($RE{net}{IPv4})/; 
} 

Zweite Skript:

#!/usr/bin/perl 

use strict; 
use warnings; 
use LWP::Simple; 
use Regexp::Common qw/net/; 

open(my $input, "<", "ips2.txt"); 

print '(', join(' OR ', map { chomp; qq{"$_"} } grep { /$RE{net}{IPv4}/ } <$input>), ")\n"; 

Wunsch gedruckte Ausgabe (viele IPs, das ist nur ein Beispiel):

("222.187.239.35" OR "222.187.239.136" OR "222.215.230.79" OR "222.215.230.85") 
+0

Das 'grep {/ $ RE {net} {IPv4} /}' ist nicht notwendig, basierend darauf, wie Sie die Datei auffüllen. – ikegami

Antwort

1
use LWP::UserAgent qw(); 
use Regexp::Common qw(net); 

# Obviously incomplete, but good enough for IP addresses. 
sub text_to_lit { 
    my ($s) = @_; 
    return qq{"$s"}; 
} 

my $url = 'https://...'; 

my $ua = LWP::UserAgent->new(); 
my $response = $ua->get($url); 
$response->is_success() 
    or die("Can't download $url: " . $response->status_line() . "\n"); 

my $content = $response->content(); 

my @ips = $content =~ /^.*?($RE{net}{IPv4})/mg; # First per line 
    -or- 
my @ips = $content =~ /$RE{net}{IPv4}/g;   # All of them 

print "(".(join " OR ", map text_to_lit($_), @ips).")\n";