为什么substr在直接传递给方法时的工作方式不同?

时间:2011-02-01 06:34:09

标签: arrays perl substring substr

我有一个关于perl的问题,我过去常常不打扰,但它现在让我烦恼。

我有一个方法调用saveItems,它从文本日志中获取一个值并解析输入。

所以我在方法中有这几行。

$intime  = $_[1];
$timeHr  = substr($intime, 0,2); 
$timeMin = substr($intime, 2,2);
$timeSec = substr($intime, 5,2);
$object[$_[0]]->hr($timeHr);
$object[$_[0]]->min($timeMin);
$object[$_[0]]->sec($timeSec);

$ intime是传递给此方法的时间值。 $ intime的样本:0431:12

我的问题是,为什么上面没有给我任何错误,但当我试图缩短这样的行时:

$object[$_[0]]->hr(substr($intime, 0,2));
$object[$_[0]]->min(substr($intime, 2,2));
$object[$_[0]]->sec(substr($intime, 5,2));

只有第一个有效,而其余的给我一个字符串错误。

我对perl相对较新,正如你所看到的,但有人可以给我一个答案吗?

修改

HR样本:

sub hr {
    my $self = shift;
    if (@_) { $self->{HR} = shift }
    return $self->{HR};
}

修改

案件结案..阅读我的答案帖子

3 个答案:

答案 0 :(得分:3)

从上面的评论中,在每个.''之后添加substr解决了您的问题。原因是->hr->min->sec方法正在以某种方式修改其参数。如果没有进一步看到它,我无法确定发生了什么。

substr函数返回一个有效左值的值。这意味着它可以分配给。因此,当这些方法中的某些东西从substr分配给切片时,它会干扰其他方法。

追加空字符串可以通过断开切片与原始字符串之间的别名(存储在$intime中)来解决问题。

如果您编写了hrminsec方法,则应该弄清楚他们为什么要修改自己的参数。在每个方法调用之间添加print "[$intime]\n";语句应该是有启发性的。

答案 1 :(得分:1)

你能想出一个自包含的可运行代码来演示这个问题吗?您描述的问题与您显示的代码不完全匹配,但我不理解代码中@ object的角色。

以下工作正常:

use strict;
use warnings;

package Class;

sub new { bless {} }

sub saveItems {
    my $intime = $_[1];
    $_[0]->hr(substr($intime, 0,2));
    $_[0]->min(substr($intime, 2,2));
    $_[0]->sec(substr($intime, 5,2));
}

sub hr {
    my $self = shift;
    if (@_) { $self->{HR} = shift }
    return $self->{HR};
}

sub min {
    my $self = shift;
    if (@_) { $self->{MIN} = shift }
    return $self->{MIN};
}

sub sec {
    my $self = shift;
    if (@_) { $self->{SEC} = shift }
    return $self->{SEC};
}

package main;

my $object = Class->new();
$object->saveItems( '0431:12' );
print "hr: ", $object->hr(), " min: ", $object->min(), " sec: ", $object->sec(), "\n";

答案 2 :(得分:0)

此事已经解决。

如下使用substr的方法,能够正常执行,没有错误。

$object[$_[0]]->hr(substr($intime, 0,2)); 
$object[$_[0]]->min(substr($intime, 2,2)); 
$object[$_[0]]->sec(substr($intime, 5,2)); 

但是,日志文件的尾随空行会导致此脚本失败。

感谢@ysth要求我重现问题,当我意识到问题实际上在于日志文件而不是脚本。

获得的经验:在提出问题之前检查代码和来源