2014-12-05 75 views
0

我有一个可以解析某些XML的循环。在这个循环中,有几个循环,如果某些值都存在,我创建一个数组,并把值这样的:如何在函数或循环中创建可用变量:strict on

for (@{ $product->{$basename} }) { 

    # there are two values for PACKAGE. create a unique list for each value 
    $package = $_->{PACKAGE}; 

    if ($package eq "RETAIL") { 
     ...values read from xml... 
     push (@myListRetail, [$one, $two, $three]; 
    } 

    if ($package eq "ADVISOR") { 
     ...values read from xml... 
     push (@myListAdvisor, [$one, $two, $three]; 
    } 

主要的XML解析后环路关闭,我再测试的存在这些阵列,并把它们放到一个新的阵列:

# add this array to the package name array 
if (@myListRetail) { 
    push @packageNames, \@myListRetail; 
} 

# add this array to the package name array 
if (@myListAdvisor) { 
    push @packageNames, \@myListAdvisor; 
} 

这是一切都很好,简单,有效。

但是,我没有用:strict on。当我打开它时,我得到“显式包”警告,因为我创建的数组没有“我的”。

我没有将它们预先声明为“my @ myListRetail”等,在循环之外,因为我需要测试它们的存在。如果我在循环中用“我的”声明它们,它们是有限的,我无法得到它们。

我知道我应该严格遵守,但是当我这样做时,脚本会因为“我的”错误而中断。

如何在一个循环中定义和创建一个变量,我可以在循环(或函数或任何其他范围)之外使用并仍然在脚本的其他地方使用它?

+0

为什么不测试它们是否为空?或者把数组放在它们各自的键下('RETAIL'和'ADVISOR'),这样你可以删除一些重复的代码。 – Biffen 2014-12-05 14:56:28

+0

我确实试图看看它们是否是空的,但我必须有一些语法错误。我会再看一遍。 – dbonneville 2014-12-05 15:31:44

+0

'if(@myListRetail> 0)' – Biffen 2014-12-05 15:33:22

回答

-3

测试,如果存在至少一个元件:

if ($myListRetail[0]) { 
    push @packageNames, \@myListRetail; 
} 
+2

如果第一个元素是'0'? – Biffen 2014-12-05 15:04:17

+1

或大小数组标量@arr:'if(标量@myListRetail> 1)...' – toto21 2014-12-05 15:07:11

+2

*'> 0'(并且你可以省略'scalar') – Biffen 2014-12-05 15:07:57

3

主XML解析环路闭合后,然后我测试存在这些阵列的 ,并把它们放入一个新的数组:

# add this array to the package name array 
if (@myListRetail) { 
    push @packageNames, \@myListRetail; 
} 

支票if (@myListRetail)不“测试@myListRetail的existance`,你似乎认为。它检查@myListRetail中元素的数量。如果数组不包含任何元素,则返回零 - 哪个Perl的计算结果为false。

所以在我看来,这已经在做你想要的东西了。所有你需要做的就是在主循环之外声明这些数组,并且每个人(包括strict)都会很高兴。

+2

准确。看起来总是使用严格的另一个原因是它有助于人们理解Perl的基本功能。我相信,如果OP从一开始就使用最佳实践,他就不会误解测试变量*存在*的想法。测试包变量的存在可能很尴尬,据我所知,如果不使用“PadWalker”模块,对于更常用的词法变量也是如此。这当然不是推荐的技术! – Borodin 2014-12-05 16:47:58