2014-01-12 3 views
0

Perl substr 함수에 문제가 있습니다. 너무 간단하지만 어쨌든 ... 문제가 뭔지 모르겠다.Perl substr error

sub encode_date 
{ 
    $date = $_[0]; 
    $day = substr($date, 0, 2); 
    $month = substr($date, 2, 2); 
    $year = substr($date, 6, 4); 

    return "$year-$month-$day"; 
} 

하위 "DD.MM.YYYY"형식의 문자열을 받아 그에게 "YYYY-MM-DD"형식으로 변환해야합니다.

입력 : 1993년 9월 9일
출력 : 0-09-93-19 ???

아무도 잘못 설명해 줄 수 있습니까?

p .: 나는 ('yyyy-mm-dd'에서 'dd.mm.yyyy'까지의) 날짜를 디코딩하기 위해 또 다른 서브를 작성했으며 모든 것이 제대로 작동합니다.

sub decode_date 
{ 
    $date = $_[0]; 
    $year = substr $date, 0, 4; 
    $month = substr $date, 5, 2; 
    $day = substr $date, 8, 2; 
    return $day.".".$month.".".$year; 
} 

물론, 반환 값의 두 substr $date, 0, 2;substr($date, 0, 2); 다른 조합을 시도했다.

+1

입니다했다
encode_date(encode_date($date)); (2 번) 사용; 나는'1993-.0-09'을 얻습니다. (여전히 틀린 부분이지만, 부분 문자열의 오프셋이 잘못되었다는 것을 감안할 때 적어도 의미가 있습니다.) – ruakh

+1

첫 번째 예에서는 사용자가 설명하는 출력을 생성하지 않습니다. 그러나, 첫 번째 예제의 sub는 off-by-one으로 어려움을 겪습니다 : 두 번째'substr' 식은'substr ($ date, 3, 2)'이어야합니다. – DavidO

+0

참. $ date는 2 번 인코딩되었습니다. 그것이 문제였습니다. 'encode_date (encode_date ($ date));'이 파일은 다른 파일에 있습니다. 타이. –

답변

3

색인의 시작은 3이고 2이 아닙니다.

sub encode_date 
{ 
    my ($date) = @_; 
    my $day = substr($date, 0, 2); 
    my $month = substr($date, 3, 2); 
    my $year = substr($date, 6, 4); 

    return "$year-$month-$day"; 
} 

는 아마도 더 좋은 방법이 아닌 자리 (.), 숫자, 역 및 대시로 그들과 합류하여 분할 문자열이 될 것 -

sub encode_date 
{ 
    my ($date) = @_; 

    return join "-", reverse split /\D/, $date; 
} 
+0

죄송합니다. 너도 같은 걸 올렸어. 잘 했어. 악마는 세부 사항에있다. 고맙습니다. –

0

귀하의 문제가, 당신의 오프셋이 잘못 그들이 때문에 돈이다 구분 기호를 고려하지 않습니다. (이 두 문자의 날짜 및 기간 후에 오기 때문에 예를 들어, 달,하지 2, 오프셋 3에서 시작됩니다.) 말했다

, 나는이 기능을 쓸 수있는 가장 좋은 방법은 생각 :

sub encode_date($) { 
    if ($_[0] =~ /^(\d\d)\.(\d\d)\.(\d{4})$/) { 
     return "$3-$2-$1"; 
    } 
} 
0
sub encode_date 
{ 
    $date = $_[0]; 
    $day = substr($date, 0, 2); 
    $month = substr($date, 3, 2); 
    $year = substr($date, 6, 4); 

    return "$year-$month-$day"; 
} 

두 가지 문제가있었습니다.
나는 또 다른이 올바른 $month = substr($date, 2, 2); 난 당신이 설명하는 출력을 재현 할 수없는 $month = substr($date, 3, 2);

+0

몇 가지 매개 변수 유효성 검사를 추가하는 것이 좋습니다. 즉 동일한 변수에서이 함수를 두 번 호출하면 오류가 발생합니다. – Davs