【问题标题】:Use of uninitialised value使用未初始化的值
【发布时间】:2016-11-11 11:27:46
【问题描述】:

我正在尝试在以下代码中调试此警告。

在 /usr/local/bin/arsed 第 207 行的连接 (.) 或字符串中使用未启动的值 $aprs_position。

foreach my $ent ( @upd_q ) {

    my $aprs_position = Ham::APRS::FAP::make_position(
        $ent->{'latitude'},
        $ent->{'longitude'},
        -1,        # speed
        -1,        # course
        -10000,    # altitude
        ( defined $ent->{'symbol'} ) ? $ent->{'symbol'} : '/[',    # symbol
        1,                                                         # compression
        0                                                          # no ambiguity
    );                                                             

    print "$aprs_position\n";

    my $packet = sprintf( '%s>APTR01:!%s', $ent->{'callsign'}, $aprs_position );

    print "$packet\n";

    if ( $aprs_enable == 1 ) {

        my $ok = $is->sendline( $packet );

        if ( ! $ok ) {
            $is->disconnect();

Ham::APRS::FAP::make_position 返回的值似乎有错误,或者可能是语法错误?

请问开始调试的最佳方法是什么?

【问题讨论】:

  • 207是哪一行?
  • @shawnhcorey:如果在代码示例中,它只能是print "$aprs_position\n"
  • @Borodin 不,它在上面的代码中出现了两次。不知道是哪一行报错,无法解决。
  • @shawnhcorey:第二次出现不是“在串联 (.) 或字符串中”。不管怎样,问题是$aprs_positionundef,所以make_position返回的值是错误的。
  • @AndyK:顺便说一下,如果你运行的是 Perl v5.10 或更高版本,那么( defined $ent->{'symbol'} ) ? $ent->{'symbol'} : '/[' 可以写成$ent->{symbol} // '/['

标签: perl


【解决方案1】:

这不是语法错误(如果是,您的代码将根本无法运行),所以您是对的,您没有从调用 Ham::APRS::FAP::make_position() 中得到预期的结果。

查看the code for the subroutine,我发现有几件事会导致它返回undef,但作者显然不相信通过显示警告来告诉您确切的问题所在。

如果是我,我会使用调试器来跟踪该子例程的执行情况,看看哪里出错了。我怀疑这是代码中处理$symbols 的东西,但我不知道你在那里传递了什么值。

我还会在应该设置该变量的行之后添加类似这样的内容。

die 'Undefined value for $aprs_position' unless defined $aprs_position;

【讨论】:

  • @AndyK:是的。本质上,函数调用的参数之一超出了界限,并且没有简单的方法来判断哪个参数。 (这完全是一个写得很奇怪的模块。)如果您不熟悉调试器,那么您可以尝试添加一系列 print 语句来显示您传递给 make_position 的值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-19
  • 1970-01-01
  • 2016-09-25
  • 1970-01-01
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多