Domanda

Sto scrivendo un semplice script Perl (su Windows) per scaricare la risposta di una richiesta GET a un URL a un file. Abbastanza diretto. Tranne quando si scrive nel file di output, ottengo interruzioni di riga in più. Così come, invece di:

<head>
  <title>title</title>
  <link .../>
</head>

ho

<head>

  <title>title</title>

  <link .../>

</head>

Ecco lo script Perl:

use LWP::Simple;

my $url = $ARGV[0];
my $content = get($url);

open(outputFile, '+>', $ARGV[1]);

print outputFile $content;

close(outputFile);

Suppongo che ho potuto solo ottenere wget per Windows , ma ora questo è infastidirmi . Come faccio a sbarazzarsi di quelle interruzioni di riga in più?!

È stato utile?

Soluzione

  1. Non c'è alcun motivo sano di mente per il modo >+ nel codice di esempio. Basta dire.
  2. LWP::Simple ha un metodo getstore. Se stai usando LWP::Simple, perché non usarlo?
  3. Per impostazione predefinita, aperta sta per spingere lo strato :crlf I / O durante l'esecuzione su win32, che si trasforma in \n \r\n. Ma i dati che stai scrittura è già \r\n, in modo che stai finendo con troppi ritorni a capo. Se si desidera che i dati vengano scritti testualmente, si dovrebbe usare binmode, o aprire la maniglia con :raw per cominciare. LWP già fa questo in modo corretto.

Altri suggerimenti

Sto indovinando che $content include già a capo CRLF e lo strato di IO di Perl sta facendo LF -> conversione CRLF. (Internamente, "\ n" è un singolo carattere in Perl, di solito LF). Mi piacerebbe aggiungere

binmode(outputFile);

dopo la open per disattivare che la conversione e scrivere i risultati delle $content direttamente.

chomp ($ content) sarebbe la mia supposizione. come sembra che ci sia nativamente già set di \ n è in esso.

EDIT: Spiacente Ho appena realizzato che chomp non funziona, a meno che non si divide il file fino in linee, quindi chomp ogni riga, come chomp chomp sarà solo la fine della stringa di input, la mia soluzione non sarebbe di aiuto in questo caso, tuttavia, è potrebbe dividerlo in \ n \ n e poi unirsi? Mi piace la soluzione di utilizzare una regex sulla stringa restituita in una risposta di seguito. tuttavia per me la modifica minore compresi alcuni ulteriori modifiche, quindi ancora separa linee ma controllerà sia per 2+ \ n del o 2+ \ r o qualsiasi combinazione dei due. per poi tornare un \ n al suo posto, in questo modo è solo andando ad avere una nuova linea per linea (si spera)

$ content = ~ s / [\ n \ r] + / \ n / g;

A CURA Sopra ancora una volta, ha messo accidentalmente una! lì per qualche motivo .... non so perché

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top