【发布时间】:2010-10-26 20:59:45
【问题描述】:
我正在尝试使用 split 函数拆分字符串,但标记之间并不总是存在值。
例如:ABC,123,,,,,,XYZ
不过,我不想跳过多个标记。这些值位于字符串中的特定位置。但是,当我进行拆分,然后尝试单步执行生成的数组时,我会收到“使用未初始化的值”警告。
我尝试过使用 $splitvalues[x] eq "" 比较值,也尝试过使用 defined($splitvalues[x]) ,但我终其一生都无法弄清楚如何识别 split 函数在何时将什么放入我的数组中令牌之间没有价值。
这是我的代码的 sn-p(现在有了更脆的好处):
my @matrixDetail = ();
#some other processing happens here that is based on matching data from the
#@oldDetail array with the first field of the @matrixLine array. If it does
#match, then I do the split
if($IHaveAMatch)
{
@matrixDetail = split(',', $matrixLine[1]);
}
else
{
@matrixDetail = ('','','','','','','');
}
my $newDetailString =
(($matrixDetail[0] eq '') ? $oldDetail[0] : $matrixDetail[0])
. (($matrixDetail[1] eq '') ? $oldDetail[1] : $matrixDetail[1])
.
.
.
. (($matrixDetail[6] eq '') ? $oldDetail[6] : $matrixDetail[6]);
因为这只是 sn-ps,所以我省略了一些其他逻辑,但 if 语句位于从技术上返回 @matrixDetail 数组的 sub 内部。如果我在矩阵中找不到匹配项并手动将数组设置为等于空字符串数组,那么我不会收到任何警告。只有当拆分填充@matrixDetail。
另外,我应该提一下,我已经编写代码将近 15 年了,但直到最近我才需要使用 Perl。我的脚本中的逻辑是合理的(或者至少,它有效),我只是在清理我的警告并试图找出这个细微差别。
【问题讨论】:
-
@matrixDetail 或@oldDetail 没有7 个元素,或者@oldDetail 有一些未定义的元素。用 Data::Dumper 找出哪个。如果定义了原始字符串,拆分将返回定义的元素,这只是多少元素的问题。
-
我的数组中的元素数量不正确似乎是一个常见的主题。但我知道我有正确的数字。正如我所提到的。该脚本有效,无论我是否使用拆分,我都会得到所需的输出。但是,如果我确实使用了拆分,并且我拆分的字符串中有空字段,那么我会收到警告。我想解决警告。
-
空字符串不会给你未初始化的值警告。您的程序还有其他问题与空字符串或
split返回的值无关。 -
有没有 stackOverflow 徽章可以证明是个白痴?如果有,我提名我。这是一个数组长度。我正在运行一个循环来设置我的 array = '' 中的任何 undef 值作为额外的预防措施。除了我使用数组长度作为循环计数器。猜猜当最后几个字段在标记之间没有值时发生了什么。我要上交我提到的那几年的经验,以换取一点尊严。