2011-11-21 2 views
9

아래 프로그램은 문자열을 재정렬하는 것입니다. 8 번째 라인에서는 정규식의 결과를 $ newdate 변수에 저장하려고 시도하고 있지만 9 번째 줄에 $ newdate가 출력되면 1을 표시합니다. $ newdate에 $ newdate가 저장되도록 코드를 어떻게 바꿀 수 있습니까? $ 정규 표현식 연산의 값은?새로운 변수에 정규 표현식 결과 저장

1 #!/usr/bin/perl 
2 
3 # This program changes the date format from mm/dd/yyyy to yyyy,mm,dd 
4 
5 $date = '21/11/2011'; 
6 print "Current: $date\n"; 
7 
8 $newdate = $date =~ s/(..)\/(..)\/(....)/$3,$2,$1/; 
9 print "New: $newdate\n"; 

답변

14

당신은 또한 다음과 같이 그것을 할 수 :

my $date = '21/11/2011'; 
print "Current: $date\n"; 
my $newdate; 
($newdate = $date) =~ s/(..)\/(..)\/(....)/$3,$2,$1/; 
print $newdate; 
+0

감사합니다 - 그게 내가 한 것입니다. – kurotsuki

+0

@kurotsuki 오신 것을 환영합니다 :) – FailedDev

4

=~ 운영자는 대체를 수행 할 때 변경 사항의 수를 반환합니다, 당신은 세계적으로 그 일을하지 않는 한 경우, 항상 0 또는 1의 값 또한, 대체이 곳에서 만들어 반환, 이렇게됩니다 목표는 $date을 수정하지 않으므로 대체하지 않으려 고합니다.

시도 :

$date =~ m/(..)\/(..)\/(....)/; 
$newdate = "$3,$2,$1"; 
+0

감사합니다. – kurotsuki

1

TIMTOWTDI의 정신 : 이것은 당신이를 원하기 때문에 일이 발생

my $date = '21/11/2011'; 

my $newdate = join ",", reverse split m#/#, $date; 

숫자의 역순. 또한이 작업을 수행 할 수 있습니다 :

my $newdate = join ",", (split m#/#, $date)[2,1,0]; 

또 다른 방법 : 또한

my $newdate = join ",", reverse ($date =~ /(\d+)/g); 

: Why use strict and warnings?

10

펄 5.13.2 때문에, 비파괴 대체는 s///r 수정을 통해 지정 될 수 있도록 일치 항목 수 대신 대체 후 문자열의 사본이 지정됩니다.

(my $new_date = $date) =~ s<(..)/(..)/(....)><$3,$2,$1>; # Pre-5.13.2 

    my $new_date = $date =~ s<(..)/(..)/(....)><$3,$2,$1>r; # Post-5.13.2 

perldoc perl5132delta 가입일 :

비파괴 교체

는 IT는 두 할당을 동일한 동작을 의미 수정되는 원래의 문자열을 방지 대입 연산자는 이제 입력 옵션을 지원하며 입력 변수 을 복사하고 사본의 대체 및 결과는 입니다. 원본은 수정되지 않은 상태로 유지됩니다.

my $old = 'cat'; 
my $new = $old =~ s/cat/dog/r; 
# $old is 'cat' and $new is 'dog'