LINUX.ORG.RU

[perl] Интерпретирование строки как число

 


0

1

Добрый день. Как заставить перл интерпретировать $t, как число?

#!/usr/bin/perl
print "content-type:text/html\n\n";
test(1);

sub test { 
  my $t=shift;
  my $n;
  $t ? $n="true:$t" : $n="false: $t";
  print $n;
  return undef;
}
Вылетает в false хоть убей. Если написать через if все нормально рабит.


> $t ? $n=«true:$t» : $n=«false: $t»;

как хорошо, что вы не хирург…

1.

$n = $t ? "true:$t" : "false: $t";

2.

$t and $n="true:$t" or $n="false: $t";

arsi ★★★★★
()

Проверить, что число:
use Scalar::Util 'looks_like_number';
...
$n= looks_like_number($t)
? «true:$t»
: «false: $t»;
...

Интерпретировать как число - просто умножьте на 1 :)

$n= $t*1
? «true:$t»
: «false: $t»;

Slavaz ★★★★★
()
Ответ на: комментарий от Slavaz

> Интерпретировать как число - просто умножьте на 1 :)

как сурово...

my $число = int ( $строка );

my $число = hex ( $hex_строка );

hydraulicbrakefluid
()
Ответ на: комментарий от arsi
test(0); # видишь нолик? жди хуйни.
$n = $t ? "true:$t" : "false: $t";

false: 0

$t and $n="true:$t" or $n="false: $t";

false: 0

$n= $t*1 ? "true:$t" : "false: $t";

false: 0

my $число = int ( $строка );

false: 0

sub test {
    my $t = shift;
    my $n;           # wtf

    $t =~ m{
        ^(
            [-+]?    # отрицательное число тоже число.
            [\d]+    # целое...
            \.?[\d]* # ...или не целое, но всё равно число.
         )$
    }x
        ? print "true: $t"
        : print "false: $t";

    print $n;        # wtf
    return undef;    # wtf
}

true: 0

или использовать модуль, как завещал персонаж выше.

anonymous
()
Ответ на: комментарий от anonymous

посмотри на то, как ТС пытался это реализовать :) и вообще, перечитай стартовый пост, много нового узнаешь ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

то, как тс пытался это реализовать, вызывает рак яичек.
запрашиваю ссылку для детального анализа ситуации.)

anonymous
()
Ответ на: комментарий от anonymous

анонимус, ты меня разочаровываешь %)

Если написать через if все нормально рабит.

а теперь догадайся, как ТС делал это через if, что у него «все нормально рабит» ;)

arsi ★★★★★
()
Ответ на: комментарий от anonymous

опять ты всё попутал :) ТС-у уже помогли, посмотри на статус треда. а сейчас мы тут тупо наблюдаем, как одному анонимусу ЧСВ мешает признать свой слив ;)

arsi ★★★★★
()
Ответ на: комментарий от arsi

с анонимусом порядок, он не парится спросить у важного дядьки пояснений, но важный дядька слишком важен, чтобы снисходить до всякой черни, да?)

anonymous
()
Ответ на: комментарий от arsi

да, вполне. теперь видно, что важные дядьки ходят в тематические интернеты почесать языком ровно настолько, чтобы не палиться в узких местах, даже в ущерб правильности предлагаемых вариантов решения проблемы.

по существу вопроса: тс попробовал заюзать тернарный оператор, забыв о приоритетах, соответственно, при любом раскладе получал ложь.
http://stackoverflow.com/questions/463155/how-does-the-ternary-operator-work
http://perldoc.perl.org/perlop.html#Operator-Precedence-and-Associativity
http://perldoc.perl.org/perlop.html#Conditional-Operator

достаточно было просто обернуть всё в скобки:

($t) ? ($n="true: $t") : ($n="false: $t");

однако, решив эту проблему, тс лишь научился использовать тернарку, но не нашел ответа на свой, собственно, вопрос - интерпретировать значение переменной как число.

самый очевидный вариант решения: не допускать дальнейшей обработки переменной, если в ней не число.

во всех вариантах выше (кроме умножения на 1 и int()/hex()), и варианта с модулем, который делает всё правильно и учитывает ноль) подпрограмма разжует строку, не подавится, и выдаст истину, потому как проверяется не тип данных, а истинность выражения.

и поэтому даже упомянутые рабочие варианты (кроме, опять же, модуля) вернут ложь в случае нуля, и истину в случае любого другого числа, потому что ноль в перле означает ложь.

поскольку перл приводит типы в зависимости от контекста, нам остается проверить «числообразность» нашей переменной, использовав регексп (либо мой смешной из примера, либо поискать по интернетам нормальный), либо специально для таких ситуаций предназначенный модуль, и в случае, если она - число, передать дальше. иначе - доложить о несоответствии типа.

anonymous
()
Ответ на: комментарий от anonymous

...верить «числообразность» нашей строки, испо... стремительный фикс во имя нидерландской королевы.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.