Perl:有人能告诉我如何解决这个警告吗
代码第1部分:Perl:有人能告诉我如何解决这个警告吗,perl,warnings,Perl,Warnings,代码第1部分: my $length = @array; 269 for (my $j=1; $j <= $length; $j+=1) { 270 271 if ( $fields[$j] =~ /dat/) { }} 代码第2部分:这里我尝试将十进制转换为十六进制 70 while (my $line = <DATA>) { 71 $line =~ s/ '([0-9]*)' / sprintf '0x%x',
my $length = @array;
269 for (my $j=1; $j <= $length; $j+=1) {
270
271 if ( $fields[$j] =~ /dat/) {
}}
代码第2部分:这里我尝试将十进制转换为十六进制
70 while (my $line = <DATA>) {
71 $line =~ s/ '([0-9]*)' / sprintf '0x%x', $1/eg;
72 print OUT $line;
}
更新
以上两个警告现在都已解决,在我为(my$j=1;$j设置
后,我假设将@array
交换到@fields
是一个输入错误
在这里,您可以获得数组中的元素数:
my $length = @array;
for (my $j=1; $j <= $length; $j+=1) {
...
}
因此,如果数组包含五个元素,$length
现在将包含5个元素。数组中的五个元素的索引为0到4
现在,您将浏览阵列的元素:
my $length = @array;
for (my $j=1; $j <= $length; $j+=1) {
...
}
这与您的原始代码完全相同,但是(在我看来)它更容易阅读
。
:这是“范围运算符”。它返回介于0和$#数组之间的整数列表
$#array
:每个数组都有一个与之关联的特殊变量($#arrayname
),该变量包含数组中的最高索引号。在本例中,该变量为4
但是我们可以对此进行改进。您实际上并不需要数组索引,是吗?您真正需要的是数组元素。您可以直接获取这些元素
for my $element (@array) {
if ($element =~ /dat/) {
..
}
}
最后,Perl程序员可能会在这里使用$\uuuu
作为变量,因为您通常不需要实际编写它:
for (@array) { # stores each element in turn in $_
if (/dat/) { # checks regex against $_
...
}
}
我假设将@array
交换到@fields
是一种打字错误
在这里,您可以获得数组中的元素数:
my $length = @array;
for (my $j=1; $j <= $length; $j+=1) {
...
}
因此,如果数组包含五个元素,$length
现在将包含5个元素。数组中的五个元素的索引为0到4
现在,您将浏览阵列的元素:
my $length = @array;
for (my $j=1; $j <= $length; $j+=1) {
...
}
这与您的原始代码完全相同,但是(在我看来)它更容易阅读
。
:这是“范围运算符”。它返回介于0和$#数组之间的整数列表
$#array
:每个数组都有一个与之关联的特殊变量($#arrayname
),该变量包含数组中的最高索引号。在本例中,该变量为4
但是我们可以对此进行改进。您实际上并不需要数组索引,是吗?您真正需要的是数组元素。您可以直接获取这些元素
for my $element (@array) {
if ($element =~ /dat/) {
..
}
}
最后,Perl程序员可能会在这里使用$\uuuu
作为变量,因为您通常不需要实际编写它:
for (@array) { # stores each element in turn in $_
if (/dat/) { # checks regex against $_
...
}
}
写下代码的一步一步的演练。(感谢ikegami在评论中提到了这一点)
代码第1部分:
my $length = @array;
269 for (my $j=1; $j <= $length; $j+=1) {
270
271 if ( $fields[$j] =~ /dat/) {
}}
这部分有问题:
- 检查数组
@array
的长度,然后使用该长度在@字段
数组上循环
- 从数组索引1开始,转到等于数组长度的数组索引(假设使用了正确的数组长度)。这是一个一次性错误。数组从0开始。您应该从0到数组
$#字段的最大索引(比长度小一个)
- 警告1与代码中写入的内容不匹配。错误应与您在代码中使用的数组
@fields
有关
- 警告1给出了错误的线路编号270。
(最后两点表示您在复制错误消息后更改了代码,这是一件不好的事情)
- 警告1表示
@array
数组中的一个值未定义。由于循环条件中存在一次性错误,因此可以猜测未定义的值位于数组的末尾,并且一旦修复循环条件,此警告将消失
代码第2部分:
- 您正在将空字符串
“
输入到sprintf
,它会发出警告。由于您的匹配被空格和单引号包围,因此输入中很可能是空字符串(即”
)。为了避免匹配,您可以使用+
而不是*
,即[0-9]+
。量词+
表示“匹配1次或更多次”,而*
表示“匹配0次或更多次”。请注意,这样做也会留下引号和空格,它们在其他时间会被删除
数据
是用于文件内数据的保留文件句柄,使用文件底部的数据
标记。除非您正在这样做,否则您应该选择另一个文件句柄。最好是词法句柄,例如my$fh
你进一步评论:
@ikegami,更改后仍收到警告
由于您没有提到这些警告是什么,我们无法帮助您。写下一步一步的代码演练。(感谢ikegami在评论中提到了其中的一些内容)
代码第1部分:
my $length = @array;
269 for (my $j=1; $j <= $length; $j+=1) {
270
271 if ( $fields[$j] =~ /dat/) {
}}
这部分有问题:
- 检查数组
@array
的长度,然后使用该长度在@字段
数组上循环
- 从数组索引1开始,转到等于数组长度的数组索引(假设使用了正确的数组长度)。这是一个一次性错误。数组从0开始。您应该从0到数组
$#字段的最大索引(比长度小一个)
- 警告1与代码中写入的内容不匹配。错误应与您在代码中使用的数组
@fields
有关
- 警告1给出了错误的线路编号270。
(最后两点表示您在复制错误消息后更改了代码,这是一件不好的事情)
- 警告1表示
@array
数组中的一个值未定义。由于循环条件中存在一次性错误,因此可以猜测未定义的值位于数组的末尾,并且一旦修复循环条件,此警告将消失
代码第2部分:
- 您正在将空字符串
“
输入到sprintf
,并且它会警告您这一点。因为您的匹配是