문제

다음 코드와 출력을 고려하십시오.

암호

#!/usr/bin/perl -w
use strict;
use Data::Dumper;
my $HOURS_PER_DAY = 24.0 * 1.0;
my $BSA = 1.7 * 1.0;
my $MCG_PER_MG = 1000.0 * 1.0;
my $HOURS_DURATION    = 20.0 * $HOURS_PER_DAY;
my $dummy = $HOURS_PER_DAY * $BSA * $MCG_PER_MG * $HOURS_DURATION;
print Dumper($HOURS_PER_DAY);
print Dumper( $BSA);
print Dumper( $MCG_PER_MG);
print Dumper( $HOURS_DURATION );

산출

$VAR1 = 24;
$VAR1 = '1.7';
$VAR1 = 1000;
$VAR1 = 480;

보시다시피, 두 번째 변수는 문자열로 취급되는 반면, 첫 번째와 앞면은 숫자로 취급됩니다. 누구든지 근본적인 논리가 무엇인지 아는 사람이 있습니까?

편집하다 추가 된 산술 계산은 문제를 완전히 해결하지 못합니다 ($ BSA 변수 참조).


$ perl -v

This is perl, v5.10.0 built for cygwin-thread-multi-64int
(with 6 registered patches, see perl -V for more detail)

Copyright 1987-2007, Larry Wall
도움이 되었습니까?

해결책

Data :: Dumper의 임무는 데이터를 직렬화하는 것이며 Perl이 출력을 기반으로 데이터와 내부적으로 수행하는 작업에 대해 많이 알 수 없습니다. 그만큼 개발 :: 엿보기 모듈은 변수에 저장된 기본 플래그와 값을 버릴 수 있습니다. DEVEL :: PEEK POD는 깃발의 중요성을 설명합니다.

#!/usr/bin/perl

use warnings;
use strict;
use Devel::Peek;

my $HOURS_PER_DAY = 24.0 * 1.0;
my $BSA = 1.7 * 1.0;
my $MCG_PER_MG = 1000.0 * 1.0;
my $HOURS_DURATION    = 20.0 * $HOURS_PER_DAY;
my $dummy = $HOURS_PER_DAY * $BSA * $MCG_PER_MG * $HOURS_DURATION;

Dump($HOURS_PER_DAY);
Dump($BSA);
Dump($MCG_PER_MG);
Dump($HOURS_DURATION);

__END__
SV = PVNV(0xd71ff0) at 0xd87f90
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,IOK,NOK,pIOK,pNOK)
  IV = 24
  NV = 24
  PV = 0
SV = PVNV(0xd71fc8) at 0xd87f60
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,NOK,pIOK,pNOK)
  IV = 1
  NV = 1.7
  PV = 0
SV = PVNV(0xd72040) at 0xd87f40
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,IOK,NOK,pIOK,pNOK)
  IV = 1000
  NV = 1000
  PV = 0
SV = IV(0xd8b408) at 0xd87f30
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,IOK,pIOK)
  IV = 480
# compare the above output to output without the assignment to $dummy:
SV = IV(0x7b0eb8) at 0x7adf90
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,IOK,pIOK)
  IV = 24
SV = NV(0x7c7c90) at 0x7adf60
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,NOK,pNOK)
  NV = 1.7
SV = IV(0x7b13d8) at 0x7adf40
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,IOK,pIOK)
  IV = 1000
SV = IV(0x7b1408) at 0x7adf30
  REFCNT = 1
  FLAGS = (PADBUSY,PADMY,IOK,pIOK)
  IV = 480

다른 팁

문자열 또는 숫자로 변수를 처리하는 Perl 처리의 전체 개념에 결함이 있습니다. Perl은 변수를 산술 연산자와 같이 필요할 때 올바른 방식으로 처리합니다. 언제나 그들의 주장을 숫자로 취급하십시오 (연산자 과부하를 남용하지 않는다고 가정).

걱정하지 말아야합니다. Perl은 그것이 무엇을하고 있는지 알고 있습니다.

Data :: Dumper는 변수의 문자열 표현에 간단한 패턴을 사용하여 숫자인지 확인합니다. 소스 코드에서 :

...
elsif ($val =~ /^(?:0|-?[1-9]\d{0,8})\z/) { # safe decimal number
  $out .= $val;
}
else {               # string
...

이것은 당신이 관찰 한 행동을 설명하는 소수점이있는 숫자와 일치하지 않습니다.

숫자 컨텍스트를 강요하는 빠른 더러운 방법 :

print Dumper( $HOURS_DURATION + 0.0 );

우려가 데이터가 표시되는 방법이라면 깨끗한 방법은 다음과 같습니다.

printf "%5.2d",$HOURS_DURATION;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top