Perl:有人能告诉我如何解决这个警告吗

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',

代码第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', $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
    ,并且它会警告您这一点。因为您的匹配是