2014-01-12 37 views
0

我有Perl substr函數的問題。這是如此簡單,但無論如何......不知道是什麼問題。Perl substr錯誤

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

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

Sub接受「DD.MM.YYYY」格式的字符串,必須將其轉換爲「YYYY-MM-DD」格式。

輸入: 1993年9月9日
輸出: 0-09-93-19 ???

有人可以解釋什麼是錯的,請。

p.s .:我爲解碼日期編寫了另一個子文件(從'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

我不能重現您所描述的輸出;我得到了'1993-0.090'(當然這仍然是錯誤的,但至少有意義,因爲你的子串偏移是錯誤的)。 – ruakh

+1

您的第一個示例不會生成您描述的輸出。然而,第一個例子的sub不會遭遇錯誤:第二個'substr'表達式應該是'substr($ date,3,2)'。 – DavidO

+0

是的。 $日期被編碼了2次。這是問題所在。 'encode_date(encode_date($ date));'這樣的東西,但在不同的文件。 TY。 –

回答

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

你的問題是,你的偏移量是錯誤的,因爲他們不沒有考慮到分隔符。 (例如,本月開始於偏移3,不2,因爲它是兩個字符的日期加上一段時間後。)

這麼說,我覺得寫這個功能最好的辦法是:

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"; 
} 

有2個問題。
我用encode_date(encode_date($date));(2次)
另一個是$month = substr($date, 2, 2);正確是$month = substr($date, 3, 2);

+0

添加一些參數驗證是明智的,所以像在同一個變量上調用該函數兩次會引發錯誤 – Davs