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.