【发布时间】:2014-01-01 06:47:37
【问题描述】:
将多个标量值连接成一个 Perl 字符串的正确方法是什么?
出于调试原因,以下代码故意是一系列语句。
my $bill_record;
$bill_record = $acct_no . " |";
$bill_record = $bill_record . defined($w_ptWtrMtrRecRef->{"mtr_addr_no"}) ? $w_ptWtrMtrRecRef->{"mtr_addr_no"} : " " . " |" ;
$bill_record = $bill_record . defined($w_ptWtrMtrRecRef->{"mtr_addr_str"}) ? $w_ptWtrMtrRecRef->{"mtr_addr_str"} : " " . " |" ;
$bill_record = $bill_record . defined($w_ptWtrMtrRecRef->{"mtr_addr_apt"}) ? $w_ptWtrMtrRecRef->{"mtr_addr_apt"} : " " . " |" ;
$bill_record = $bill_record . $issue_date . " |";
| 字符用作分隔符。每行都将以'\n 终止。
最后一行之后$bill_record = $bill_record . $issue_date . " |";
出现这个错误:
Use of uninitialized value $bill_record in concatenation (.) or string at /home/ics/include/WsBillFunc.pm line 1022.
at /home/ics/include/WsBillFunc.pm line 1022
$issue_date 在分配时定义。
什么可能导致$bill_record 变得未定义,将一堆标量值连接成一个字符串的正确方法是什么?
【问题讨论】:
-
首先使用
$bill_record .= ...而不是$bill_record = $bill_record . ...会更容易阅读。另外,我会添加足够多的括号,以便操作顺序显而易见。 -
@woolstar 很好,但为什么呢?我认为采用原始标量
$bill_record并使用.也可以。 -
构建一个数组然后
join(' |', ...)它可能也更干净,IMO 比一堆字符串连接更符合您的意图。 -
您可能应该查找
//=运算符(及其相关运算符//)以及.=。它们允许您编写:$bill_record .= ($w_ptWtrMtrRecRef->{"mtr_addr_no"} // " ") . " |";,这比在页面的 RHS 上滚动的表达式更容易阅读。这确实假设您至少有 Perl 5.10,IIRC;但是你现在应该使用 5.18(或者如果你有逆行操作系统,可能是 5.16,比如 Mac OS X 10.9.1 Mavericks,它发布了 5.16.2)。 -
你说的不是真的。发出该消息时,这不是您的代码,或者
$issue_date未定义。