【问题标题】:How to remove these warnings in Perl? [closed]如何在 Perl 中删除这些警告? [关闭]
【发布时间】:2020-10-29 10:38:41
【问题描述】:

这里我正在检查每列中存在的最大字宽

my @col_lns;
while (<file>) {
  my @row = split " ",$_;
  @col_lns = map ((length) @rows) if $. ==1;

for ( my $col_l =0; $col_l <$#row; $col_l+=1) {
my $col_ln = length $row[$col_l];

  if ($col_lns[$col_l] < $col_ln)    ###Here I am getting warning
{
  $col_lns[$col_l] = $col_ln;
}
}

警告 1:

Use of uninitialized value in numeric lt (<) 

代码第 2 部分

my $pack1 = substr($add,4,4);
my $pack2 = substr($add,0,4);

警告 2

Use of $add in substr
substr outside of string 

【问题讨论】:

  • 你声明了my $col_ln,但后来你使用了$coln。这是故意的,还是错误的?如果你没有使用use strict,Perl 不会反对你错误地“创建”一个新变量并尝试使用它,它会给出一个未初始化的警告。
  • Use of $add in substr 看起来不像是一个真正的警告。看起来您删除了部分警告,例如 Use of uninitialized value $add in substr,这将解释另一个错误(未定义的字符串长度为 0)。
  • @HG 你永远不应该在代码不是确切在你尝试运行它时的样子的地方发布问题。这违背了大多数问题的全部目的。如果您没有使用use strict,请将其添加到您的程序中,修复错误,然后使用固定代码编辑您的问题。
  • Re "你永远不应该发布代码与你尝试运行它时不完全一样的问题。",正确。但需要明确的是,我们也不想要不相关的细节。创建一个显示问题的最小可运行 sn-p,运行它以确保它确实存在,然后发布。
  • Re "我猜你的意思是map { length } @rowsmap(length, @rows)",你仍然可以在第一种语法中使用括号。所以也许他们想要map( { length } @rows )

标签: perl warnings


【解决方案1】:

你自己诊断这些真的不难。

在数字 lt (

您知道发出此警告的代码:

if ($col_lns[$col_l] < $coln)

因此,当您执行此行时,$col_lns[$col_l]$coln 包含 undef。如果我无法找出问题所在,我会在执行那行代码之前添加一个显示这两个值的打印语句。我可能还会输入$col_l 以显示我们正在查看的数组元素。

鉴于your previous question 中的混乱以及您仍在使用已被建议不要使用的 C 风格 for 循环这一事实,我很确定这是由于您退出数组的末尾。

$add 在 substr 中的使用

字符串外的子字符串

那里的第一个警告很奇怪。对我来说,这看起来不像是 Perl 警告。你是不是编辑太多了?但第二个很清楚。您正在尝试获取子字符串,但使用的值超出了源字符串的长度。再次,您可以通过打印您在代码中使用的值来调查此问题。

可能值得指出的是,有一个perldiag 手册页,其中包含所有 Perl 的错误和警告以及对它们含义的更详细解释。您可以通过在代码中添加 use diagnostics 来获得在运行时显示的这些解释 - 但请在问题解决后将其删除。

【讨论】:

  • Re "那里的第一个警告很奇怪。[...]你编辑的太多了吗?",肯定应该是Use of uninitialized value $add in substr。这也解释了随后的警告。 undef的字符串化为空字符串,所以substr(undef,4,4)等价于substr("",4,4)(除了警告),导致第二次警告。关键是修复第一个可能会修复第二个。
猜你喜欢
  • 2020-10-04
  • 2015-04-23
  • 2017-05-14
  • 2020-09-14
  • 1970-01-01
  • 2013-03-11
  • 1970-01-01
  • 2017-01-25
相关资源
最近更新 更多