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

Ник*_*шин 1 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.
Run Code Online (Sandbox Code Playgroud)

我看到

我决定了

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";
}
Run Code Online (Sandbox Code Playgroud)

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

Axe*_*man 10

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

join '', grep { defined; } @_;
Run Code Online (Sandbox Code Playgroud)

但是,您需要为每个值定义或不定义指标.

sub make_string { join( ',', map { $_ || '' } @_ ); }
Run Code Online (Sandbox Code Playgroud)

但这是你可以做的另一件事.

my $str
    = do { no warnings 'uninitialized'; 
           join( ',' @_ ); 
      };
Run Code Online (Sandbox Code Playgroud)

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