Как преобразовать строку Perl в число (целое или с плавающей точкой), чтобы удовлетворить ограничения типа Moose? - PullRequest
1 голос
/ 17 апреля 2020

У меня есть переменная 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

1 Ответ

0 голосов
/ 18 апреля 2020

Не ставьте "" около% d

perl -e 'my $a = "2"; printf(%d, $a); '
...