Держите первые 2 части строки с разделителем - PullRequest
0 голосов
/ 27 ноября 2018

Есть ли более лаконичный / perlish способ для следующего:

my @components = split /-/, $original;
my $final_string = $components[0]."-".$components[1];  

Ввод - это строка, содержащая не более 2 -, а последний необязательный.Я всегда хочу сохранить первую часть.Т.е. 10-9-1 должно стать 10-9 и 10-9, так как ввод должен остаться 10-9

Ответы [ 4 ]

0 голосов
/ 27 ноября 2018

Решения regex, которые вы получили, вероятно, являются наилучшим подходом, но также возможно сделать это с split() и join().

# You need this to use 'say()'
use feature 'say';

while (<DATA>) {
  chomp;

  say join '-', (split /-/)[0, 1];
}

__DATA__
10-9-1
10-9

(split /-/)[0, 1] принимает список, возвращенный изsplit() и дает вам первые два элемента списка.

0 голосов
/ 27 ноября 2018
$original =~ m/^([^\-]+\-[^\-]+)/ or warn "Unable to match regex in string: $original";
my $final_string = $1;

Думаю, это ответит на ваш запрос.Он не ограничен какой-либо конкретной строкой - например, текст после дефиса должен быть цифрой или чем-то еще.Он также предупредит вас, если он не совпадает.

Это предполагает, что переменная $original имеет только один экземпляр для сопоставления (выведенный из кода в вопросе).

0 голосов
/ 27 ноября 2018

Здесь проще использовать совпадение с регулярным выражением.

my ($final_string) = $original =~ /^([^-]*-[^-]*)/;

Если вы хотите внести изменения на месте, замена отлично работает.

$original =~ s/^[^-]*-[^-]*\K.*//s;
0 голосов
/ 27 ноября 2018
use Modern::Perl;

my $re = qr/-\d+\K.*$/;
while(<DATA>) {
    chomp;
    s/$re//;
    say;
}
__DATA__
10-9-1
10-9

Только для строки:

my $original = '10-9-1';
(my $final = $original) =~ s/-\d+\K.*$//;
say $final;

Объяснение:

s/
    -       # find the first dash in the string
    \d+     # 1 or more digits
    \K      # forget all we have seen until this posiiton
    .*      # rest of the line
    $       # end of line
//
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...