2

使用 Perl,我希望找到在数组中定义的最后一个元素。

到目前为止,我有以下内容:

#generating array
$array[100] = (undef);
$array[$columns[1]-1] = $columns [2];

#finding the last element that is defined
for ($i=100; $i>=0; $i--) {
    if (($array[$i] != undef) && (!defined($lastdef)) ){
        $lastdef=$i;
    }
}

我不确定为什么这不起作用。使用 Perl 有什么改进的建议吗?

4

4 回答 4

10

我不确定为什么这不起作用。使用 Perl 有什么改进的建议吗?

您不知道它为什么不起作用的原因是因为您没有使用

use warnings;

如果你有,你会被告知:

Use of uninitialized value in numeric ne (!=) at ...

因为!=数字不等式运算符,它会将其参数转换为数字。如果您没有warnings打开,这将默默地转换undef0. 不用说,warnings开机是一件非常好的事情,这样你就不会犯这样的错误。

就是这一行:

if (($array[$i] != undef) ...

那应该是

if ((defined($array[$i]) ...

因为它是defined检查定义值的函数。这是一个奇怪的错误,因为您甚至在同一行上使用了相同的功能。

此外,您可以通过这样做使这更简单

if (defined($array[$i])) {
     $lastdef = $i;
     last;
}

last当找到第一个未定义的值时,将在此处结束循环。

您还应该知道,您可以在循环条件上使用非硬编码的最大值:

for (my $i = $#array; $i >= 0; $i--) {

$#array包含数组中现有最高索引的编号。

于 2013-07-27T16:17:14.687 回答
3

使用List::Util函数可以更简洁。这将找到定义的数组中的最后一个元素,但不是它的索引。要查找它的索引,您可以使用而不是执行与答案类似的操作。definedeq

use List::Util qw(first);

my $lastdef = first { defined($_) } reverse @array;
于 2013-07-27T16:00:35.923 回答
2

以下内容有点丑陋和晦涩(与@TLP 的出色答案相比),但写起来很有趣:

#!/usr/bin/env perl

use strict;
use warnings;

use feature 'say';

for my $i (0, 1) {
    my $array = generate_array(8, $i);
    say join ' ', map $_ // '_', @$array;
    say index_of_last_defined_element($array);
}

sub index_of_last_defined_element {
    my $x = $#{ $_[0] };
    my $v = $_[0]->[$x];
    return $x if defined($v) or $x < $[;
    $#{ $_[0] } -= 1;
    goto &index_of_last_defined_element;
}

sub generate_array {
    my $size = shift;
    my $array = [ (undef) x $size ];
    shift or return $array;
    $array->[rand $#$array] = 'x';
    return $array;
}

输出:

_ _ _ _ _ _ _ _
-1
_ _ _ _ _ X _ _
5

当然,这有点傻。您应该使用List::MoreUtils::last_index

use feature 'say';
use List::MoreUtils qw(last_index);

for my $i (0, 1) {
    my $array = generate_array(8, $i);
    say join ' ', map $_ // '_', @$array;
    say last_index { defined($_) } @$array;
}
于 2013-07-27T19:56:14.260 回答
1

您需要从 99 开始,因为 100 个元素的数组具有索引:0 .. 99。一旦找到元素就中断循环:

#!/usr/bin/perl

use strict;
use warnings;

my @array = (1, 2, undef);

my $lastdef;
for (my $i = $#array; $i>=0; $i--) {
    if (defined($array[$i])){
        $lastdef=$i;
        last;
    }
}

print $lastdef;

印刷品:1

于 2013-07-27T16:01:55.587 回答