2011-02-01 46 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"; 
相關問題