어떻게 말해야하는 경우는 변수가 있는 숫자 값에서는 Perl?

StackOverflow https://stackoverflow.com/questions/12647

  •  08-06-2019
  •  | 
  •  

문제

거기에 간단한 방법으로서는 Perl 수 있다는 결정하는 경우에는 지정된 변수는 숫자?의 라인을 따라 뭔가:

if (is_number($x))
{ ... }

이 이상적입니다.기술지 않을 던지는 경고를 경우 -w 스위치가 사용되고 있는 것은 확실히 좋습니다.

도움이 되었습니까?

해결책

Scalar::Util::looks_like_number() 을 사용하는 내부 Perl C API looks_like_number()함수는,아마도 가장 효율적인 방법입니다.참고하는 문자열"inf"그리고"무한대"은 숫자로 처리됩니다.

예제:

#!/usr/bin/perl

use warnings;
use strict;

use Scalar::Util qw(looks_like_number);

my @exprs = qw(1 5.25 0.001 1.3e8 foo bar 1dd inf infinity);

foreach my $expr (@exprs) {
    print "$expr is", looks_like_number($expr) ? '' : ' not', " a number\n";
}

이 출력:

1 is a number
5.25 is a number
0.001 is a number
1.3e8 is a number
foo is not a number
bar is not a number
1dd is not a number
inf is a number
infinity is a number

도 참조하십시오:

다른 팁

체크아웃 CPAN 모듈 Regexp::흔.나도 그렇게 생각은 정확하게 당신이 필요하고 처리하는 모든 경우(예:실수로 과학적인 기법,etc.).예:

use Regexp::Common;
if ($var =~ /$RE{num}{real}/) { print q{a number}; }

원래의 질문이었는 방법을 말하는 경우는 변수이었다 숫자하지 않을 경우,그것이"있는 숫자 값을".

거기에 몇 가지 운영자가 별도의 동작 모드에 대한 숫자와 문자열 피연산자,여기서"숫자"란에서 아무리 노력해도 원래 숫자 또는 적용에 숫자 컨텍스트(예:에 $x = "123"; 0+$x, 하기 전에,또한 $x 문자열입니다,나중에 그것은 간주됩니다 숫자).

말하는 하나의 방법입니다 이것:

if ( length( do { no warnings "numeric"; $x & "" } ) ) {
    print "$x is numeric\n";
}

간단한(그리고 어쩌면 단순)질문에 대한 답변을 의 내용 $x 숫자 은 다음과 같다:

if ($x  eq  $x+0) { .... }

그것은 텍스트의 비교 원 $x$x 숫자로 변환.

일반적으로 번호 검사가 수행으로 정규표현식이 있습니다.이 코드는 것을 결정하는 경우에는 숫자 뿐만 아니라 확인을 위해 정의되지 않은 변수를 던지는 경고:

sub is_integer {
   defined $_[0] && $_[0] =~ /^[+-]?\d+$/;
}

sub is_float {
   defined $_[0] && $_[0] =~ /^[+-]?\d+(\.\d+)?$/;
}

여기에 몇 가지 읽기 자료 해야 합니다.

완벽하지 않습니다,하지만 당신이 사용할 수 있는 regex:

sub isnumber 
{
    shift =~ /^-?\d+\.?\d*$/;
}

믿지 않는 것이 있다 builtin 그것을 할 수 있습니다.이상 당신이 이제까지 보고 싶었던 주제에 참조하십시오 Perlmonks 에서 검출 숫자

약간 더 강력한 정규 표현식에서 찾을 수 있습 Regexp::흔.

그것은 소리처럼 당신이 알고 싶다면 Perl 생각하는 변수는 숫자입니다.여기에는 함수가 함정을 경고:

sub is_number{
  my $n = shift;
  my $ret = 1;
  $SIG{"__WARN__"} = sub {$ret = 0};
  eval { my $x = $n + 1 };
  return $ret
}

또 다른 옵션을 끄고 경고 로컬로:

{
  no warnings "numeric"; # Ignore "isn't numeric" warning
  ...                    # Use a variable that might not be numeric
}

참고하는 숫자가 아닌 변수가 자동으로 변환이 0,아마 당신이 무엇을 원하는 어쨌든.

rexep 지 않습니다.이것은:

use Try::Tiny;

sub is_numeric {
  my ($x) = @_;
  my $numeric = 1;
  try {
    use warnings FATAL => qw/numeric/;
    0 + $x;
  }
  catch {
    $numeric = 0;
  };
  return $numeric;
}

이것을 보십시오:

If (($x !~ /\D/) && ($x ne "")) { ... }

이미지

if ( $value + 0 eq $value) {
    # A number
    push @args, $value;
} else {
    # A string
    push @args, "'$value'";
}

개인적으로 생각하는 방식 이동에 의존하는 것입니다 Perl 의 컨텍스트 내부 솔루션을 만들기 위해 탄알 증거입니다.좋은 regexp 수 있는 경기하는 모든 유효한 숫자값도의 숫자가 아닌 사람(또는 그 반대로)지만,있는 방법의 채택은 동일한 로직 인터프리터를 이용해 안전에 의존하는 직접 있습니다.

내가 실행하는 경향이 스크립트로 -w, 을 결합의 아이디어를 비교하는 결과"플러스 가치 제로"원래 값으로 no warnings 기반 접근 방법의@ysth:

do { 
    no warnings "numeric";
    if ($x + 0 ne $x) { return "not numeric"; } else { return "numeric"; }
}

정규 표현식을 사용할 수 있습을 결정하는 경우$foo 는 번호(또는 아닙니다).

은 여기를 참조하십시오:여부를 어떻게 확인할 수 있는 스칼라 이번호

는 경우(정$x&&$x!~ m/\/D){} 나 $x=0 는 경우!$x,if($x!~ m/\/D){}

이것은 약간의 변형에 Veekay 의 응답만을 설명해 보겠 내 추론에 대한 변경합니다.

을 수행하는 regex 에서 정의되지 않은 값의 원인이됩 오류가 분출이 발생하는 코드 출구에서 많지 않은 경우 대부분의 환경입니다.테스트는 경우 값을 정의하거나 설정 기본 경우에서처럼 대를 들어 실행하기 전에 식이 최소한 저장하는 오류로그에 기록한다.

이 기능의 작업에 대한 저:

    sub IS_Integer() 
    {
        my $Text = shift;
        my $Integer = 0;

        if ($Text =~ /\D/)
        {
            $Integer = 1;
        }
        if ($Text =~ /^\d+$/)
        { 
            $Integer = 1;
        }
        if ($Text =~ /^-?\d+$/)       
        { 
            $Integer = 1;
        }
        if ($Text =~ /^[+-]?\d+$/)    
        { 
            $Integer = 1; 
        }
        if ($Text =~ /^-?\d+\.?\d*$/) 
        {
            $Integer = 1; 
        }
        if ($Text =~ /^-?(?:\d+(?:\.\d*)?&\.\d+)$/) 
        {
            $Integer = 1;
        }
        if ($Text =~ /^([+-]?)(?=\d&\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/)
        {
            $Integer = 1;
        }

        return $Integer;
    }
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top