Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 为什么substr在直接传递到方法中时工作方式不同?_Arrays_Perl_Substring_Substr - Fatal编程技术网

Arrays 为什么substr在直接传递到方法中时工作方式不同?

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

我有一个关于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};
}
编辑


结案。。从上面的评论中阅读我的回答帖子,在每个
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不存在此问题