1

我有一个关于 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 相对较新,但是任何人都可以给我答案吗?

编辑

样本人力资源:

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

编辑

案例关闭..阅读我的回答帖子

4

3 回答 3

3

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

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

附加一个空字符串通过破坏切片和原始字符串(存储在 中$intime)之间的别名来解决问题。

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

于 2011-02-01T06:57:00.843 回答
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";
于 2011-02-01T08:50:45.270 回答
0

这件事已经解决了。

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

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

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

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

经验教训:在提出问题之前检查代码和来源

于 2011-02-01T09:01:32.187 回答