Qual è il modo più semplice per restituire la prima riga di una stringa multilinea in Perl?

StackOverflow https://stackoverflow.com/questions/428065

  •  06-07-2019
  •  | 
  •  

Domanda

Quando dico semplice, intendo, all'interno di un'espressione, in modo da poterlo inserire come valore in un hash senza prima prepararlo. Pubblicherò la mia soluzione ma ne sto cercando una migliore che mi ricordi meno VB. :)

È stato utile?

Soluzione

Che ne dici

( split /\n/, $s )[0]

Non devi preoccuparti che \ n non sia multipiattaforma perché Perl è abbastanza intelligente da occuparsene .

Altri suggerimenti

Questo non è semplice come vuoi, ma essere semplici solo per essere brevi non dovrebbe sempre essere l'obiettivo.

Puoi aprire un filehandle su una stringa (come riferimento scalare) e trattarlo come un file per leggere la prima riga:

my $string = "Fred\nWilma\Betty\n";
open my($fh), "<", \$string or die ...; # reading from the data in $string
my $first_line = <$fh>; # gives "Fred"
close $fh;

Se lo volessi davvero, immagino che potresti ridurlo a un'espressione:

$hash{$key} = do { open my($fh), "<", \$string; scalar <$fh> };

Indipendentemente dal metodo scelto, è sempre possibile creare una subroutine per restituire la prima linea e quindi utilizzare la chiamata della subroutine nell'assegnazione hash.

sub gimme_first_line { ... }

$hash{$key } = gimme_first_line( \$string );
($str =~ /\A(.*?)$/ms)[0];

Per stringhe di grandi dimensioni, questo sarà più veloce di

(split /\n/, $str)[0]

come suggerito da Manni. [Modifica: rimossa la menzione errata di split / \ n /, $ str, 1 .]

Se vuoi includere il terminale \ n se è presente, aggiungi \ n? appena prima della parentesi chiusa nella regex.

substr($s, 0, index($s, $/) > -1 ? index($s, $/) || () )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top