Perl中的数组问题

时间:2012-03-09 15:19:17

标签: arrays perl

我是Perl的新手,在Perl中使用数组有些困难。有人可以向我解释为什么我无法在下面的脚本中打印数组的值。

$sum=();
$min = 999;
$LogEntry = '';
foreach $item (1, 2, 3, 4, 5)
{
  $min = $item if $min > $item;
  if ($LogEntry eq '') {
    push(@sum,"1"); }
    print "debugging the IF condition\n";
}
print "Array is: $sum\n";
print "Min = $min\n";

我得到的输出是:

debugging the IF condition
debugging the IF condition
debugging the IF condition
debugging the IF condition
debugging the IF condition
Array is:
Min = 1

我不应该Array is: 1 1 1 1 1(5次)。 有人可以帮忙吗? 感谢。

8 个答案:

答案 0 :(得分:7)

你需要两件事:

use strict;
use warnings;

此时代码中的错误($sum而不是@sum)应该变得明显......

答案 1 :(得分:6)

正如其他人所说,您需要了解Perl使用符号($@%)表示数据结构以及数据访问的方式。< / p>

您正在使用标量符号($),它只会尝试访问名为$sum的标量变量,该变量与名为@sum的完全不同的数组变量无关 - 你显然想要后者。

让您感到困惑的是,一旦数组变量@sum存在,您可以使用$sum[0]语法访问数组中的各个值,但这里是sigil + braces({{1} })充当“统一的”句法结构。


你需要做的第一件事(在使用严格和警告之后)是阅读以下关于Perl中的符号的文档(除了好的Perl书):


我可以为您提供有关在Perl中访问数据结构的语法的最佳摘要(引自我之前的评论)

  • sigil表示您要检索的数据结构中的数据量({1}}为1个元素,$[]表示元素列表,$整个哈希)

  • 而大括号样式代表您的数据结构(数组的正方形,散列的卷曲)。

    作为一种特殊情况,当没有大括号时,sigil将表示数据量以及数据结构。


请注意,在您的具体情况下,这是重要的最后一点。由于你将数组作为一个整体引用,你将不会有大括号,因此sigil将代表数据结构类型 - 因为它是一个数组,你必须使用@ sigil。

答案 2 :(得分:5)

$ sum与@sum不是同一个变量。

在这种情况下,您可以通过以下方式启动脚本:

use strict;
use warnings;

Strict强制您声明所有变量,警告会发出警告..

在此期间,将第一行更改为:

@sum = ();

和倒数第二行:

print "Array is: " . join (', ', @sum) . "\n";

请参阅join

答案 3 :(得分:3)

push将值@sum放入数组$sum,然后通过打印标量@sum来完成。 $sumprint "@sum\n"是两个完全独立的变量。如果你改为{{1}},你应该得到输出“11111”。

答案 4 :(得分:2)

print "Array is: $sum\n";

将打印一个名为$ sum的不存在的标量变量,而不是数组@sum而不是数组的第一项。

如果你'使用严格',它将标记用户未初始化的变量,如下所示。

答案 5 :(得分:2)

您绝对应该在脚本中添加use strict;use warnings;。那会抱怨print "Array is: $sum\n";行(等等) 并使用my @sum=();而不是my $sum=();

初始化数组

答案 6 :(得分:1)

就像CFL_Jeff提到的那样,你不能只是快速打印。相反,做一些像:

print "Array is ".join(', ',@array);

答案 7 :(得分:1)

仍想在此图片中添加一些细节。 )

请参阅,Perl以非常高级语言而闻名。这不仅仅是因为您可以将(1,2,3,4,5)替换为(1..5)并获得相同的结果。

并不是因为您可以在没有(明确)为其分配一些初始值的情况下保留变量:my @arrmy @arr = ()my $scal一样好(而不是my $scal = 'some filler value' })实际上可能会在一天内节省一两个小时。 Perl通常(有use warnings,是的)擅长在不寻常的地方发现未定义的值 - 但对于'填充值'不太幸运......

VHLL的真正意义在于,在我看来,你可以用Perl代码表达一个解决方案,就像任何可用的人类语言一样(有些可能更不适合那种情况)。

不相信我?好的,检查你的代码 - 或者说你的任务集,例如。

需要找到数组中的最低元素吗?或者数组中所有值的总和? List :: Util模块是您的命令:

use List::Util qw( min sum );
my @array_of_values = (1..10);

my $min_value     = min( @array_of_values );
my $sum_of_values = sum( @array_of_values );

say "In the beginning was... @array_of_values";
say "With lowest point at $min_value"; 
say "Collected they give $sum_of_values"; 

需要从另一个数组构造一个数组,过滤掉不需要的值吗? grep在这里拯救这一天:

@filtered_array = grep { $filter_condition } @source_array;

看模式?不要试图将你的解决方案编码成一些机器编码的mumbo-jumbo。 )用您自己的语言找到解决方案,然后找到将该解决方案转换为Perl代码的方法。它比你想象的容易。 )

免责声明:我确实知道重新发明轮子可能有助于学习为什么轮子在第一时间如此有用。但是我确实看到轮子重新实现的频率 - 在生产代码中变得更加丑陋和变慢 - 只是因为人们习惯了这种思维方式。