Arrays 为什么substr在直接传递到方法中时工作方式不同?
我有一个关于perl的问题,过去我并不关心这个问题,但现在它困扰着我 我有一个方法调用saveItems,它从文本日志中获取一个值并解析输入 所以我在方法中有这几行Arrays 为什么substr在直接传递到方法中时工作方式不同?,arrays,perl,substring,substr,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]]-&g
$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};
}
编辑
结案。。从上面的评论中阅读我的回答帖子,在每个
substr
解决您的问题后添加“
。原因是->hr
、->min
和->sec
方法正在以某种方式修改其参数。没有进一步的了解,我无法确定发生了什么
substr
函数返回一个有效的左值。这意味着可以将其分配给。因此,当这些方法中的某些内容分配给substr中的切片时,它会干扰其他方法
附加一个空字符串可以通过断开切片和原始字符串(存储在$intime
中)之间的别名来修复此问题
如果编写了
hr
、min
和sec
方法,您应该了解它们修改参数的原因。添加打印“[$intime]\n”每个方法调用之间的代码>语句应该是有启发性的。从上面的注释中,在每个substr
之后添加”
,以解决您的问题。原因是->hr
、->min
和->sec
方法正在以某种方式修改其参数。没有进一步的了解,我无法确定发生了什么
substr
函数返回一个有效的左值。这意味着可以将其分配给。因此,当这些方法中的某些内容分配给substr中的切片时,它会干扰其他方法
附加一个空字符串可以通过断开切片和原始字符串(存储在$intime
中)之间的别名来修复此问题
如果编写了hr
、min
和sec
方法,您应该了解它们修改参数的原因。添加打印“[$intime]\n”每个方法调用之间的代码>语句应该是有启发性的。您能想出自包含的可运行代码来演示这个问题吗?您描述的问题与您展示的代码不太匹配,尽管我不理解@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";
你能想出自包含的可运行代码来演示这个问题吗?您描述的问题与您展示的代码不太匹配,尽管我不理解@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";
这件事已经解决了
使用substr的方法如下,可以正常执行,没有错误
$object[$_[0]]->hr(substr($intime, 0,2));
$object[$_[0]]->min(substr($intime, 2,2));
$object[$_[0]]->sec(substr($intime, 5,2));
但是,正是日志文件的尾随空行导致该脚本失败
感谢@ysth让我重现这个问题,当时我意识到问题实际上在于日志文件而不是脚本
吸取的教训:在提出问题之前检查代码和源代码此问题已解决
使用substr的方法如下,可以正常执行,没有错误
$object[$_[0]]->hr(substr($intime, 0,2));
$object[$_[0]]->min(substr($intime, 2,2));
$object[$_[0]]->sec(substr($intime, 5,2));
但是,正是日志文件的尾随空行导致该脚本失败
感谢@ysth让我重现这个问题,当时我意识到问题实际上在于日志文件而不是脚本
吸取的教训:在提出问题之前,请检查代码和源代码您能告诉我们您看到的确切错误吗?“第xx行字符串外部的substr”。。其中xx包含“$object[$\u0]]->min(substr($intime,2,2));”如果在每个substr之后添加”
,会得到什么?不知何故,它只会抱怨第二行,无论我如何重新排列lines@Eric它起作用了!但你能解释一下原因吗?你能告诉我们你看到的确切错误吗?“第xx行字符串外的substr”。。其中xx包含“$object[$\u0]]->min(substr($intime,2,2));”如果在每个substr之后添加”
,会得到什么?不知何故,它只会抱怨第二行,无论我如何重新排列lines@Eric它起作用了!但是你能给我解释一下为什么吗?通过附加一个空字符串,它可以将切片从原始切片中独立分离成某种新的变量,从而使我们能够操纵它吗?它仍然打印[0431:12]在每次方法调用和我用hr方法的示例更新问题之间,连接运算符
将其参数复制到一个新字符串中。在复制过程中,别名被破坏了。我明白了。。谢谢你抽出时间。。我完全理解这一点concept@robobooga:您显示的示例hr没有描述问题,并且它在每个方法调用之间打印完整的0431:12也表明发生了其他事情,至少在您的一些尝试中是这样。因此,通过附加一个空字符串,它将切片从原始变量中独立出来,形成某种新的变量,从而使我们能够对其进行操作?它仍然在每个方法调用之间打印[0431:12],我用hr方法的示例更新了问题。串联运算符将其参数复制到一个新字符串中。在复制过程中,别名被破坏了。我明白了。。谢谢你抽出时间。。我完全理解这一点concept@robobooga:您显示的示例hr不存在此问题