繁体   English   中英

Perl的substr错误

[英]Perl substr error

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

子接受“ DD.MM.YYYY”格式的字符串,并且必须将其转换为“ YYYY-MM-DD”格式。

输入: 09.09.1993
输出: 0-09-93-19 ???

任何人都可以解释什么问题。

ps:我写了另一个用于解码日期的子项(从'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); 以及返回值的不同组合。

月从索引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";
}

也许更好的方法是用非digit( . )分割字符串,将数字反向,然后用破折号将它们连接起来-

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

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

您的问题是您的偏移量是错误的,因为它们没有考虑分隔符。 (例如,月份从偏移量3而不是2 ,因为它是在两个字符的日期加上句点之后。)

也就是说,我认为编写此函数的最佳方法是:

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

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

有两个问题。
我用encode_date(encode_date($date)); (2次)
另一个是$month = substr($date, 2, 2); 正确的是$month = substr($date, 3, 2);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM