Какой самый простой способ вернуть первую строку многострочной строки в Perl? - PullRequest
10 голосов
/ 09 января 2009

Когда я говорю «простой», я имею в виду, в выражении, чтобы я мог вставить его в качестве значения в хеш, не подготавливая его сначала. Я опубликую свое решение, но я ищу лучшее, которое меньше напоминает мне VB. :)

Ответы [ 4 ]

28 голосов
/ 09 января 2009

Как насчет

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

Вам не нужно беспокоиться о \ n не кроссплатформенности, потому что Perl достаточно умен, чтобы позаботиться об этом .

4 голосов
/ 10 января 2009

Это не так просто, как вам нравится, но быть простым, чтобы быть коротким, не всегда должно быть целью.

Вы можете открыть файловый дескриптор строки (как скалярную ссылку) и обработать его как файл для чтения первой строки:

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;

Если бы вы действительно хотели, я думаю, вы могли бы сократить это до выражения:

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

Независимо от того, какой метод вы выберете, вы всегда можете создать подпрограмму для возврата первой строки, а затем использовать вызов подпрограммы в своем хэш-присваивании.

sub gimme_first_line { ... }

$hash{$key } = gimme_first_line( \$string );
2 голосов
/ 10 января 2009
($str =~ /\A(.*?)$/ms)[0];

Для больших строк это будет быстрее, чем

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

как предложено Манни. [Редактировать: удалено ошибочное упоминание split /\n/, $str, 1.]

Если вы хотите включить терминал \n, если он присутствует, добавьте \n? непосредственно перед закрывающей парой в регулярном выражении.

0 голосов
/ 09 января 2009
substr($s, 0, index($s, $/) > -1 ? index($s, $/) || () )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...