Gegeben

my $t=+"aaa";

Ist es möglich zu überprüfen, ob der Zwang erfolgreich sein wird (ich weiß, dass dies hier nicht der Fall ist), bevor Sie $ t verwenden?

Übrigens: Ich möchte wirklich überprüfen, ob eine Zeichenfolge eine gültige Ganzzahl ist. Ich weiß, dass ich zu diesem Zweck einen regulären Ausdruck verwenden kann, aber ich nehme an, dass es eine einfachere Lösung gibt.

3
rogergl 27 Dez. 2015 im 21:36

3 Antworten

Beste Antwort

+'aaa' führt zu einem Fehler, bei dem es sich um eine Art Null handelt, die einem undefinierten Wert ähnelt. Das heißt, Sie können alles verwenden, was mit ihnen funktioniert.

my $t = +$s with +$s; # $t remains undefined
my $t = +$s // 0; # $t === 0
my $t = (+$s).defined ?? +$s !! 0;

Da Sie nur prüfen möchten, ob es sich um einen Int handelt

my $t = +$s ~~ Int ?? +$s !! 0; # Failures aren't a type of Int
my $t = 0;
with +$s {
  when Int { $t = $_ }
  default { ... } # +$s is defined
} else {
  ... # optional else clause
}
5
Brad Gilbert 27 Dez. 2015 im 19:58

Noch eine andere Version:

my $t = +"aaa" orelse note "could not coerce to numeric type";
say $t.^name; # Failure

orelse ist die Version von // mit niedriger Priorität. In dieser Version erfolgt die Zuweisung zu $t weiterhin, aber die Überprüfung auf Definiertheit behandelt den Fehler, dh er wird nicht explodieren und einen Fehler auslösen.

3
Christoph 27 Dez. 2015 im 21:46

Wickeln Sie es um einen Try-Block, um die Ausnahme abzufangen.

my $t;
try {
  $t = +"aaa";
  CATCH { say "the coercion didn't work" when X::Str::Numeric; }
}
-1
bb94 30 Dez. 2015 im 20:11