Вы следующее выражение:
$string =~/Board Length,(\d+\.\d+)/
ваша строка это:
Board Length,45,inches
Строка будет соответствовать шаблону Board Length,
. Однако остальная часть нашего шаблона соответствует одной или нескольким цифрам с последующим периодом, следующим за одной или несколькими цифрами. Это не соответствует строке 45
. Там нет десятичной дроби.
Вопрос в том, что вы пытаетесь найти.Например, если число окружено запятыми, вы можете сделать это:
$string =~ /Board Length,([^,]+),/;
my $number = $1;
[^,]
означает Не запятая. Вы записываете все после запятой в следующую запятую. Это позволит вам захватить 45
, 45.32
и даже 4.5e+10
. Просто что-нибудь между этими двумя запятыми.
Обратите внимание, что вы используете $1
для своей первой группы захвата, а не $_
.
Другой способ заключается в использовании нежадным соответствия:
$string =~ /Board Length,(.+?),/;
my $number = $1;
Что произойдет, если то, что захватывается не является числом? Вы можете проверить, что с помощью looks_like_number
функции из Scalar::Util
(который был включен в дистрибутивах Perl в течение длительного времени) .:
use Scalar::Util qw(looks_like_number);
my $string = "Board Length,Extra long,feet,...";
...
$string =~ /Board Length,(.+?),/;
my $number = $1;
if (looks_like_number($number)) {
print "$number is a number\n";
}
else {
print "Nope. $number isn't a number\n";
}
Да, я в конечном итоге поймать, что немного после того, как я отправил это. Благодарю. – user1768884