2017-12-14 15 views
3

간단히 말해서 누락되었지만 s///은 변경된 문자열을 내 변수에 할당하지 않습니다. 나는 더 간단한 s///을 시도하고 그것이 효과가있다.Mastering Regular Expressions의 Perl 대체 예가 저에게 맞지 않습니다

이 예에서는 4 자리 이상인 경우 소수 자릿수 뒤에 임의의 자릿수를 잘라야합니다.

my $price = 12.34567; 
print "$price\n"; 
$price =~ s/(\.\d\d[1-9]?)d*/$1/; 
print "$1\n";   # This is printing .345 correctly. 
print "$price\n";  # This should be 12.345 but is unchanged. 

my $story = "dog"; 
$story =~ s/(do)g/$1/; 
print "$story\n"; # This works. It's changed to "do" 

편집 : 세 번째 숫자가 0이면 두 자리 다음에 자릅니다. 주식 가격 꾸미는데

" 을 ... 다른 숫자를 제거, 항상 소수점 처음 2 자리 숫자를 가지고, 그것은 0이 아닌 경우에만 세 번째 자리를 취할 다음

+3

될해야'\ d' 대신 d''의. –

+1

백 슬래시가 누락 된 것 외에도 RE는 제대로 보이지 않습니다.'12.34'에 대해 예상되는 결과는 무엇입니까? –

+0

그게 전부 였어. 고맙습니다. @Benjamin W. – user3064085

답변

1

귀하의 대체를.. 잘못된 것입니다. d*는 빈 문자열을 일치 할 수 있기 때문에

$price =~ s/(\.\d\d[1-9]?)d*/$1/; 

$price =~ s/(\.\d\d[1-9]?)\d*/$1/; 

당신의 자신의 버전이 일치해야하는 세 번째 소수 자리 뒤에 d 문자가 없기 때문에 발생합니다.

세 번째 10 진수는 0이 아니어야합니다. 그래서 0.00은 괜찮지 만 0.000은 그렇지 않으며 이전의 값으로 잘립니다. 그게 당신이 의도 한 것입니까?

+1

는 그였다 감사 그것을 ! [책 이미지 (https://imgur.com/a/fy3zk) 의 "주가를 꾸미는데 항상 소수점 처음 두 자릿수을, 세 번째를 취할 0이 아닌 경우에만 자릿수를 입력하십시오. 그런 다음 다른 숫자를 제거하십시오. " – user3064085

+0

이것은 [알려진 에라타늄]입니다 (http://www.oreilly.com/catalog/errata.csp?isbn=9780596528126#page81). 기술 서적, IETF RFC 또는 이와 유사한 것을 읽는다면 에라타를 확인하는 것이 좋습니다. – daxim

0

실제로 마지막 "d"앞에 백 슬래시가 누락되었습니다.

변경 첫 substiturion 명령에 :

$price =~ s/(\.\d\d[1-9]?)\d*/$1/;