2011-02-01 47 views
1

我有一个关于perl的问题,我过去不用担心,但它现在正在扰乱我。为什么substr直接传入方法时工作方式不同?

我有一个方法调用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是传入此方法的时间值。 样品$银泰: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}; 
} 

编辑

结案......阅读我的回答后

+1

您能告诉我们您看到的确切错误吗? – codaddict 2011-02-01 06:39:26

+0

“substr在字符串的外部:xx”.. 其中xx包含“$ object [$ _ [0]] - > min(substr($ intime,2,2));” – robobooga 2011-02-01 06:47:47

+1

你会得到什么if你在每个substr后面添加`。''`? – 2011-02-01 06:51:04

回答

0

这件事情已经得到解决。

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

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

但是,它是日志文件尾部空行,导致此脚本失败。

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

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

3

从上面的意见,各substr后加入.''解决了你的问题。原因在于->hr->min->sec方法正在以某种方式修改它们的参数。没有进一步看,我不能确定发生了什么。

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

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

如果你写了hr,minsec方法,你应该弄清楚他们为什么要修改他们的参数。在每个方法调用之间添加print "[$intime]\n";声明应该是显而易见的。

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"; 
相关问题