我有一个关于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};
}
修改
案件结案..阅读我的答案帖子
答案 0 :(得分:3)
从上面的评论中,在每个.''
之后添加substr
解决了您的问题。原因是->hr
,->min
和->sec
方法正在以某种方式修改其参数。如果没有进一步看到它,我无法确定发生了什么。
substr
函数返回一个有效左值的值。这意味着它可以分配给。因此,当这些方法中的某些东西从substr分配给切片时,它会干扰其他方法。
追加空字符串可以通过断开切片与原始字符串之间的别名(存储在$intime
中)来解决问题。
如果您编写了hr
,min
和sec
方法,则应该弄清楚他们为什么要修改自己的参数。在每个方法调用之间添加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要求我重现问题,当我意识到问题实际上在于日志文件而不是脚本。
获得的经验:在提出问题之前检查代码和来源