Perl에서 문자열을 숫자로 어떻게 변환 할 수 있습니까?


86

10 진수 값을 포함하는 문자열이 있고 해당 문자열을 부동 소수점 변수로 변환해야합니다. 그래서 제가 가지고있는 문자열의 예는 "5.45"이고 부동 소수점을 원하므로 여기에 .1을 추가 할 수 있습니다. 인터넷을 검색했지만 문자열을 정수로 변환하는 방법 만 볼 수 있습니다.


질문에 더 자세한 정보가 필요합니다. 문자열이 숫자로만 구성되어 있습니까? 영숫자? 알파가 제거되면 괜찮습니까? 결과 번호에 대한 특정 목적이 있습니까?
JGurtz

답변:


90

변환 할 필요가 전혀 없습니다.

% perl -e 'print "5.45" + 0.1;'
5.55

25
5.55는 정수가 아닙니다
OrangeDog

15
@OrangeDog OP는 질문을 편집했습니다 (이 답변이 게시 된 지 몇 달 후)-원래 질문에는 실제로 부동 소수점 숫자가 있습니다.
Alnitak 2012 년

1
문자열에 쉼표가있을 때 비교는 어떻습니까?
Ramy

[rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" unless "1,000" > 10;' nope [rabdelaz@Linux_Desktop:~/workspace/akatest_5]$perl -e 'print "nope\n" if "1,000" > 10;'
Ramy

73

이것은 간단한 해결책입니다.

예 1

my $var1 = "123abc";
print $var1 + 0;

결과

123

예 2

my $var2 = "abc123";
print $var2 + 0;

결과

0

7
AFAIU 이것은 질문에 대한 유일한 답변입니다
Cougar

4
문자열에 0을 추가 할 때주의하십시오. 문자열이 "inf"또는 "nan"으로 시작하면 값은 0이 아닙니다. 예 : my $ var2 = "info123"; $ VAR2 + 0을 인쇄 : 결과가 될 것입니다 : Inf를
로드리고 드 알메이다 시퀘에게

나는 a를 foreach my $i ('00'..'15')하고 있었고 일부 장소에서 선행 0을 제거해야했습니다. 이 0+숫자에 캐스팅 또한을 달성한다.
stevesliva 2016

분명히 이것은 16 진수 문자열에서 작동하지 않습니다. '0x14C'+ 0은 0 (arrggg)을 반환합니다
Allasso

41

Perl은 컨텍스트 기반 언어입니다. 사용자가 제공 한 데이터에 따라 작업을 수행하지 않습니다. 대신 사용하는 연산자와 사용하는 컨텍스트를 기반으로 데이터를 처리하는 방법을 알아냅니다. 숫자와 같은 일을하면 숫자를 얻게됩니다.

# numeric addition with strings:
my $sum = '5.45' + '0.01'; # 5.46

문자열과 같은 일을하면 문자열을 얻습니다.

# string replication with numbers:
my $string = ( 45/2 ) x 4; # "22.522.522.522.5"

Perl은 대부분 무엇을해야하는지 알아 내고 대부분 옳습니다. 같은 말을하는 또 다른 방법은 Perl이 명사보다 동사에 더 신경을 쓴다는 것입니다.

무언가를하려고하는데 작동하지 않습니까?


여기 내 지식 부족을 용서하지만 두 번째 예를 얻지 못합니다. 두 숫자를 나눈 다음 곱하면 어떻게 / 왜 문자열이 생성됩니까?
기드온

4
나는 숫자를 곱하지 않습니다. 는 x문자열 복제 연산자입니다.
brian d foy 2013 년

3
my $string = ( 45/2 ) x 3; # "22.522.522.5"44 대신 45로 해야하지 않습니까? '0.5의가 ... 결과에 어디에서 왔는지 그렇지 않으면 내가하지 않습니다
Vickster

10

Google은 필이 묻는 동일한 질문 (수레 정렬)을 검색하는 동안 나를 여기로 안내하여 스레드가 오래 되었음에도 불구하고 답변을 게시 할 가치가 있다고 생각했습니다. 나는 펄을 처음 접했고 여전히 내 머리를 감싸고 있지만 brian d foy의 말 "Perl은 명사보다 동사에 더 신경을 씁니다." 위는 정말 머리에 못을 친다. 정렬을 적용하기 전에 문자열을 부동 소수점으로 변환 할 필요가 없습니다. 값을 문자열이 아닌 숫자로 정렬하도록 정렬에 지시해야합니다. 즉

my @foo = ('1.2', '3.4', '2.1', '4.6');
my @foo_sort = sort {$a <=> $b} @foo;

정렬에 대한 자세한 내용 은 http://perldoc.perl.org/functions/sort.html 을 참조하십시오.


8

내가 이해했듯이 int () 는 데이터 유형을 지정하는 '캐스트'함수로 의도되지 않았으며 여기에서 컨텍스트를 산술로 정의하는 데 사용됩니다. $ val이 숫자로 취급되도록 과거에 (ab) (0 + $ val)을 사용했습니다.


예, int()"(ab) used"입니다. 알았다.
Sapphire_Brick

6
$var += 0

아마도 당신이 원하는 것입니다. 그러나 $ var가 문자열이면 숫자로 변환 할 수없는 경우 오류가 발생하고 $ var 는 0으로 재설정됩니다 .

my $var = 'abc123';
print "var = $var\n";
$var += 0;
print "var = $var\n";

로그

var = abc123
Argument "abc123" isn't numeric in addition (+) at test.pl line 7.
var = 0

3

Perl에는 실제로 스칼라, 배열 및 해시의 세 가지 유형 만 있습니다. 그리고 그 구별조차도 논쟁의 여지가 있습니다. ;) 각 변수가 처리되는 방식은 사용하는 작업에 따라 다릅니다.

% perl -e "print 5.4 . 3.4;"
5.43.4


% perl -e "print '5.4' + '3.4';"
8.8

5
Perl에는 더 많은 유형이 있지만 단일 값의 경우 단일 값일뿐입니다.
brian d foy

1

비교에서 스칼라가 문자열의 수이면 차이가 있습니다. 그리고 그것은 항상 결정 가능한 것은 아닙니다. 나는 펄이 "과학적"표기법으로 부동 소수점을 검색하고 비교에서 아래 몇 줄을 동일하게 사용한 경우를보고 할 수 있습니다.

use strict;
....
next unless $line =~ /and your result is:\s*(.*)/;
my $val = $1;
if ($val < 0.001) {
   print "this is small\n";
}

그리고 여기 $val에서 예를 들어에서 "2e-77"검색된 숫자로 해석되지 않았습니다 $line. 0 (또는 좋은 C 프로그래머의 경우 0.0)을 추가하는 것이 도움이되었습니다.


0

Perl은 약한 유형과 컨텍스트 기반입니다. 사용하는 연산자에 따라 많은 스칼라를 문자열과 숫자로 처리 할 수 ​​있습니다. $a = 7*6; $b = 7x6; print "$a $b\n";
당신은 42 777777.

그러나 미묘한 차이가 있습니다. 텍스트 파일의 숫자 데이터를 데이터 구조로 읽어 들인 다음을 사용하여 볼 때 Data::Dumper숫자가 인용 된 것을 알 수 있습니다. Perl은 그것들을 내부적으로 문자열로 취급합니다.
읽기 : $my_hash{$1} = $2 if /(.+)=(.+)\n/;.
덤프:'foo' => '42'

덤프에서 인용되지 않은 숫자를 원하는 경우 :
읽기 : $my_hash{$1} = $2+0 if /(.+)=(.+)\n/;.
덤프:'foo' => 42

$2+0 당신이 숫자 연산자를 사용했기 때문에 펄 고지 당신은 숫자로 $ 2 처리했다고.

나는 두 개의 해시를와 비교하는 동안 이것을 발견했습니다 Data::Dumper.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.