$ 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";
}
我决定了这个问题,但我想知道如何在其他人身上解决这个问题
答案 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
必须是字符串。
但是,如其他答案中所述,您可以仅针对未初始化的变量禁用警告。