2011-11-16 72 views
1
$ 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. 

我看到如何避免在串联(。)中使用未初始化的值?在Perl v5.8.4

我决定

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"; 
} 

我决定的问题,但我我想知道这个问题怎么能在别人需要解决

+2

你看什么? (“我明白这一点”在这方面并不完整。)你决定了什么?在调用'make_string()'之前,你还没有初始化'$ sysid','$ ver'和'$ tradetype'。你应该真的考虑升级到Perl 5.14.1(你是当前的三个主要版本)。 (FWIW:你的测试代码在我的Mac上使用5.10.0和5.14.1干净地工作,我没有编译Perl 5.8.x。) –

+1

@JonathanLeffler第二个例子工作。在'sub make_string'中,他用三元运算符和map初始化它们。但我仍然不明白他的问题。我想这是关于第一个例子。 – dave

+1

@tze,这可能是因为他没有提出问题。 – ikegami

回答

0

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

$a$b必须是字符串。

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

+2

请在downvoting时发表评论,以便downvote本身可以用于学习新内容。 – dave

3

无论是测试definedness或关闭周围的代码的警告,你不希望看到的投诉:

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

或更好'没有警告qw(未初始化);',看[perllexwarn](http://perldoc.perl.org/perllexwarn.html) – Onlyjob

10

加入群一概而论对象的最常用的方法是去除值grep

join '', grep { defined; } @_; 

但是,您希望为每个值定义一个指标,或不定义。

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

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

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

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

+1

是不是更好使用'map {$ _ //''} ? – dave

+0

@tze在5.8? :) – Axeman

+0

对不起,我忘了:) – dave

相关问题