Как я могу напечатать значения undef как нули в Perl? - PullRequest
2 голосов
/ 14 сентября 2010

Я строю матрицу подсчета в Perl, используя AoA: my @aoa = (), затем вызываю $aoa[$i][$j]++ всякий раз, когда мне нужно увеличить конкретную ячейку.Поскольку некоторые ячейки вообще не увеличиваются, они остаются undef (это эквивалентно 0 отсчетам).

Я хотел бы вывести некоторые строки из матрицы, но я получаю ошибки для undef ячеек(который я просто хотел бы напечатать как нули).что мне делать?

Ответы [ 3 ]

9 голосов
/ 14 сентября 2010

Используйте defined с условным оператором (?:).

#!/usr/bin/perl

use strict;
use warnings;

my @matrix;

for my $i (0 .. 3) {
    for my $j (0 .. 3) {
        if (rand > .5) {
            $matrix[$i][$j]++;
        }
    }
}

for my $aref (@matrix) {
    print join(", ", map { defined() ? $_ : 0 } @{$aref}[0 .. 3]), "\n"
}

Если вы используете Perl 5.10 или более позднюю версию, вы можете использовать определенный оператор или (//).

#!/usr/bin/perl

use 5.012;
use warnings;

my @matrix;

for my $i (0 .. 3) {
    for my $j (0 .. 3) {
        if (rand > .5) {
            $matrix[$i][$j]++;
        }
    }
}

for my $aref (@matrix) {
    print join(", ", map { $_ // 0 } @{$aref}[0 .. 3]), "\n"
}
7 голосов
/ 14 сентября 2010

Классический:

print defined $aoa[$i][$j] ? $aoa[$i][$j] : 0;

Modern Perl (5.10 или более поздняя версия):

print $aoa[$i][$j] // 0;

Это гораздо более кратко и Perlish, надо сказать.

Как вариант, перед печатью пропустите матрицу, заменив undef на 0.


use strict;
use warnings;

my @aoa = ();

$aoa[1][1] = 1;
$aoa[0][2] = 1;
$aoa[2][1] = 1;

for my $i (0..2)
{
    print join ",", map { $_ // 0 } @{$aoa[$i]}[0..2], "\n";
}
0 голосов
/ 14 сентября 2010

Просто пример, пожалуйста, измените код в соответствии с вашими требованиями.

use strict;
use warnings;

my @aoa;

$aoa[1][3]++;

foreach my $i (1 .. 3){
    foreach my $j (1 .. 3){
        defined $aoa[$i][$j] ? print $aoa[$i][$j] : print "0";
        print "\t";
    }
    print "\n";
}
...