разделить и назначить в одном выражении в Perl - PullRequest
2 голосов
/ 30 августа 2010
@temp = split(/\./, $_);
$val = $temp[1];
$val =~ s/\D//;

Каков правильный синтаксис для записи одного оператора вместо этих трех операторов в Perl?

($val = split(/\./, $_)[1]) =~ s/\D//;

дает мне

синтаксическая ошибка в test.plстрока 126, рядом с ") ["

Выполнение test.pl прервано из-за ошибок компиляции.

Ответы [ 3 ]

14 голосов
/ 30 августа 2010

Вот как:

$_="ab123.ab456cd.78";
($val = (split(/\./))[1])=~ s/\D//g;
print $val;

(я позволил себе использовать неявное $_ в split и добавить тег /g к s///, потому что удалял один нецифровыйс фронта не имело особого смысла.)

Теперь вы знаете это, не делайте этого .Это не понятно для чтения, это не показывает ваши намерения, и это ужасно.Гораздо понятнее:

$val = (split /\./)[1];
$val =~ s/\D//g;

Код написан не только для компьютера.Это написано для людей, чтобы читать, чтобы они могли позже изменить его.Если вы не напишите хороший код для следующего парня (который может быть вас через 2 месяца), следующий парень будет ужасно разбираться в том, что вы сделали.

9 голосов
/ 30 августа 2010

Срез списка выглядит как (LIST)[LIST]; Вы пропустили () часть.

($val = (split(/\./, $_))[1]) =~ s/\D//;
4 голосов
/ 30 августа 2010

Вот оно:

(my $val = (split /\./)[1]) =~ s/\D//;

Вы имели в виду \D+, случайно?

Тест:

#!perl
use warnings;
use strict;
$_ = "22.99grams";
(my $val = (split /\./)[1]) =~ s/\D+//;
print "$val\n";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...