У меня есть переменная Perl, созданная из значения, полученного с веб-страницы. Эта переменная используется для создания экземпляра атрибута объекта Moose с ограничением типа (например, тип «Int»). Это ограничение типа не работает, если я использую переменную как есть (Validation failed for 'Int' with value "2" at constructor...
). Я попробовал явное приведение (my $newvar = int($oldvar);
) и sprintf (my $newvar = sprintf("%d", $oldvar);
), как предложено в Как я могу преобразовать строку в число в Perl? . Оба они непоследовательны и часто приводят к 0
. Я попробовал предложения, такие как abs()
и арифметические c ops (например, +
), упомянутые в https://perldoc.perl.org/perlnumber.html, которые опять-таки не являются надежными при преобразовании значений в удовлетворение Moose. Поскольку я не смог получить ограничение типа Int
для последовательного успешного выполнения с непредсказуемыми значениями с веб-страницы, я не расширил свой класс Moose до других ограничений типа, таких как float
или ArrayRef[Int]
, в качестве ограничения union
. Я поместил урезанный код ниже.
ОБНОВЛЕНИЕ: Когда я пытался воспроизвести проблему с урезанным кодом, я обнаружил, что JSON -> decode () добавляет двойные кавычки , Эквивалентный код приведен ниже (Примечание: он отлично работает с '2' или "2", но когда значение равно "2" ", оно не работает. Я просто передаю декодированное значение в класс Moose. После того, как я заметил JSON - > декодирование заключает в себе значения в двойных кавычках, даже если они уже закодированы, я застрял в догадках, сколько дополнительных двойных кавычек будет проходить через CGI, конечно, правильно экранирован. Я думаю, что моя задача сейчас состоит в том, чтобы взять CGI-> param () и удалите все кавычки, которые JSON может добавить, чтобы сделать его числом.
MyEvent.pm:
#!/usr/bin/perl
package MyEvent;
use strict;
use warnings;
use Moose;
use Moose::Util::TypeConstraints;
# MyEvent has identifier
has identifier => (
is => 'rw',
isa => 'Int',
predicate => 'has_identifier',
required => 1
);
no Moose;
__PACKAGE__->meta->make_immutable;
MyEventTest.pm
#!/usr/bin/perl
use strict;
use warnings;
use utf8;
use Data::Dumper;
use MyEvent;
use lib '/home/user/tests/mooseTests';
my $id = '"2"'; # <<< Notice the double quoted string inside single quotes
my $myEvt = MyEvent->new("identifier" => $id);
print Dumper $myEvt;
Это производит:
Attribute (identifier) does not pass the type constraint because: Validation failed for 'Int' with value "2" at constructor MyEvent::new (defined at /home/user/tests/mooseTests/MyEvent.pm line 28) line 39
MyEvent::new('MyEvent', 'identifier', '"2"') called at MyEventTest.pl line 15