¿Cuál es la forma más sencilla de devolver la primera línea de una cadena de varias líneas en Perl?

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

  •  06-07-2019
  •  | 
  •  

Pregunta

Cuando digo simple, quiero decir, dentro de una expresión, para que pueda pegarlo como un valor en un hash sin prepararlo primero. Publicaré mi solución, pero estoy buscando una mejor que me recuerde menos a VB. :)

¿Fue útil?

Solución

¿Qué tal

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

?

No tiene que preocuparse por \ n no ser multiplataforma porque Perl es lo suficientemente inteligente como para encargarse de eso .

Otros consejos

Esto no es tan simple como te gustaría, pero ser simple para ser breve no siempre debe ser el objetivo.

Puede abrir un identificador de archivo en una cadena (como referencia escalar) y tratarlo como un archivo para leer la primera línea:

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;

Si realmente quisieras, supongo que podrías reducir esto a una expresión:

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

No importa qué método elija, siempre puede hacer una subrutina para devolver la primera línea y luego usar la llamada de subrutina en su asignación de hash.

sub gimme_first_line { ... }

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

Para cadenas grandes, esto será más rápido que

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

según lo sugerido por Manni. [Editar: eliminó la mención errónea de split / \ n /, $ str, 1 .]

Si desea incluir el terminal \ n si está presente, agregue \ n? justo antes del par de cierre en la expresión regular.

substr($s, 0, index($s, $/) > -1 ? index($s, $/) || () )
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top