【问题标题】:"Use of uninitialized value $ in concatenation (.) or string..." error even when values are initialized“在连接 (.) 或字符串中使用未初始化的值 $...”即使值已初始化也会出错
【发布时间】:2017-04-27 13:06:03
【问题描述】:

我对初始化值有疑问。我有一个具有方法的脚本:

sub compare_with_terminal {
    use Term::Size::Any qw( chars pixels );
    my $columns = 0; 
    my $rows = 0;
    ($columns, $rows) = chars *STDOUT{IO};  

    print "Columns: ".$columns."\n"; #line 73
    print "Rows: ". $rows."\n";

    if($height > $columns || $width > $rows){
        print "Bigger than terminal: ";
        my $option = <>;
        chomp($option);
        if($option eq "N"){
            print "End.";
            exit 0;
        }
    }
} 

我创建并初始化了两个值 $columns$rows。但是,当我运行这个脚本时,我得到:

在连接 (.) 或字符串中使用未初始化的值 $columns ./perl/script.pl 第 73 行 (#1) (W 未初始化)一个未定义的值被使用,就好像它已经被使用一样 定义。它被解释为“”或 0,但可能是一个错误。 要抑制此警告,请为您的变量分配一个定义的值。

$rows 有同样的错误。

这些错误表明我没有初始化变量$columns,但我做到了。任何人都可以解释我并尝试解决这个问题?

【问题讨论】:

  • 第 73 行是什么? (我猜你没有显示它,因为你没有在你的 sn-p 的任何地方使用$columns
  • 我读取控制台大小并将其写入$columns$rows 变量。我希望它们是数字,而不是字符串。在 Windows 上一切正常,我没有收到任何错误。
  • @allocer 同样,请显示哪一行是第 73 行,因为那是警告提到的那一行。
  • Re“这些错误说我没有初始化变量$columns”,如果你真的阅读了这个消息,它根本没有说。它说$columns 有一个未定义的值,而不是它没有“初始化”。 (其实在Perl中不初始化是不可能的,标量会自动初始化为undef,数组和哈希初始化为空。)
  • @allocer 以后,请复制并粘贴您实际运行的确切代码或创建minimal reproducible example。否则我们很难找到您的问题。

标签: perl variables exception initialization


【解决方案1】:

There is a bug report for Term::Size::Any

在 linux 上使用不带任何参数的 char 会为我返回值(Term::Size::Any 版本 0.002):

use warnings;
use strict;

use Term::Size::Any qw(chars);
my ($columns, $rows) = chars();
print "$columns $rows\n";

__END__

80 24

您将 $column 初始化为 0,但在您调用 chars 函数时它被覆盖。

【讨论】:

  • 看起来不错。我在 Windows 上对其进行了测试,一切正常。很快我会在 Unix 上检查它。
  • 注意:chars() 等价于chars(*STDIN),所以你应该改用chars(*STDOUT)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-05-20
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2022-11-04
相关资源
最近更新 更多