如何避免在连接中使用未初始化的值(。)?在perl v5.8.4中

时间:2011-11-16 17:29:55

标签: perl initialization

$ perl -e 'use warnings;my ($a,$b);$c=$a.$b;print $c'
Use of uninitialized value in concatenation (.) or string at -e line 1.
Use of uninitialized value in concatenation (.) or string at -e line 1.

我明白了

我决定了

use 5.8.4;
use strict;
use warnings;
use Test::More tests => 2;
my ( $start, $end, $sysid, $ver, $tradetype );
( $start, $end ) = ( 1, 10 );
my $test = make_string( $start, $end, $sysid, $ver, $tradetype );
is( $test, "1,10,,,\n", "make index string" );
is( make_string( 0, 0, 0, 0, 0, ), "0,0,0,0,0\n", "test number" );

sub make_string {
    my @input      = @_;
    my @input_init = map { !defined $_ ? '' : $_ } @input;
    my $rezult     = join q{,}, @input_init;
    return $rezult . "\n";
}

我决定了这个问题,但我想知道如何在其他人身上解决这个问题

3 个答案:

答案 0 :(得分:10)

加入一组无条件定义对象的最常用方法是按grep

删除值
join '', grep { defined; } @_;

但是,您需要为每个值指定一个指标,无论是否定义。

sub make_string { join( ',', map { $_ || '' } @_ ); }

但是你可以做另外一件事。

my $str
    = do { no warnings 'uninitialized'; 
           join( ',' @_ ); 
      };

有些人对关闭警告有不必要的保留意见。

答案 1 :(得分:3)

测试定义或禁用围绕您不希望看到投诉的代码的警告:

use warnings;
...
no warnings;
my ($a, $b);
my $c = $a . $b;
use warnings;

答案 2 :(得分:0)

由于undef值不表示字符串,而二元运算符.连接两个字符串,因此无法避免使用use warnings发出警告。

$a$b必须是字符串。

但是,如其他答案中所述,您可以仅针对未初始化的变量禁用警告。