Как найти абсолютное горизонтальное значение в perl - PullRequest
1 голос
/ 28 января 2020

У меня есть этот код

if (@row1) {
            die "Bad format!" if @row1 != @row2;
            my @new = map { abs ($row2[$_] - $row1[$_]) } 0..$#row2;

, в результате которого получается абсолютное значение row2 -row1.

Я попытался вместо abs (row2-row1) найти абсолютное значение элемент 2 - элемент 1 одной и той же строки каждой из всех строк, в непрерывном верхнем коде. Моя цель - получить abs (row2 -row1) -> из новых значений -> второй элемент -первый элемент одной и той же строки для всех строк.

1 2 3 4

1 4 3 4

1 5 2 3

стать

0 2 0 0

0 1 1 1

что уже сделано, а затем получить окончательный вывод

2 2 0

1 0 1

Поэтому я отредактировал верхний код:

 for ($i=1,$i++,$i>$row){
   my @new1 = map { abs ($row1[$2+$i] - $row1[$1+$i]) } 0..$#row1;
              say join " ", @new1;}

но я получил "Использование неинициализированного значения $ i дополнительно". Я также заменяю $ i на «my $ i», а также на «i» и go те же ошибки. Может ли кто-нибудь объяснить мне, почему то, что я пытаюсь сделать, неправильно?

Ответы [ 3 ]

2 голосов
/ 28 января 2020
my @rows = (
   [ 1, 2, 3, 4 ],
   [ 1, 4, 3, 4 ],
   [ 1, 5, 2, 3 ],
);

my $num_cols = @{ $rows[0] };

for my $r (1..$#rows) {
   die "Bad format!" if @{ $rows[$r] } != $num_cols;

   my @diffs = map { abs($rows[$r-1][$_] - $rows[$r][$_]) } 0..$num_cols-1;
   my @diff_diffs = map { abs($diffs[$_-1] - $diffs[$_]) } 1..$num_cols-1;
   say "@diff_diffs";
}
0 голосов
/ 29 января 2020

Вопрос ОП не очень ясен, что он хочет делать с данными.

Насколько я понимаю, он хотел бы применить по вертикали и по горизонтали abs diff рекурсивно.

Для упрощения обработки кода были реализованы две подпрограммы abs_vdiff и abs_hdiff .

#!/usr/bin/perl
#
# USAGE:
#   prog.pl
#
# Description:
#   Demonstration code for StackOverflow Q59945359
#
# StackOverflow: 
#   Question 59945359
#
# Author:
#   Polar Bear
#
# Date: Tue Jan 28 13:35:00 PST 2020
#

use strict;
use warnings;
use feature 'say';

my $array = read_array();
my $vdiff = abs_vdiff($array);
my $hdiff = abs_hdiff($vdiff);

say "Read array";
show($array);
say "ABS vertical diff";
show($vdiff);
say "ABS horizontal diff";
show($hdiff);
say "We done";

sub read_array {
    my @data;

    while( <DATA> ) {
        my @row = split ' ';
        push @data, \@row;
    }

    return \@data;
}

sub abs_vdiff {
    my $array = shift;
    my @result;

    foreach my $i ( 1..$#{$array} ) {
        my @data = map { abs(@{@{$array}[$i]}[$_]-@{@{$array}[$i-1]}[$_]) } 0..$#{@{$array}[$i]};
        push @result, \@data;
    }
    return \@result;
}

sub abs_hdiff {
    my $array = shift;
    my @data;

    foreach my $row (@{$array}) {
        my @row = map { abs(@{$row}[$_]-@{$row}[$_+1]) } 0..$#{$row}-1;
        push @data, \@row;
    }

    return \@data;
}

sub show {
    my $array = shift;

    foreach my $row ( @{$array} ) {
        say join ' ', @{$row};
    }
}

__DATA__
1 2 3 4
1 4 3 4
1 5 2 3

Выход

Read array
1 2 3 4
1 4 3 4
1 5 2 3
ABS vertical diff
0 2 0 0
0 1 1 1
ABS horizontal diff
2 2 0
1 0 0
We done
0 голосов
/ 28 января 2020

Одно из многих возможных решений проблемы

use strict;
use warnings;
use feature 'say';

use Data::Dumper;

my $debug = 0;      # debug flag

my $flag = 1;
my @current;
my @previous;
my @final;

say "First stage";

while( <DATA> ) {
    @current = split ' ';
    if( $flag ) {
        @previous = @current;
        $flag = 0;
        next;
    }
    if( $#current != $#previous ) {
        say "Ops, lines have different number of elements";
        say "Previous: " . join ' ', @previous;
        say "Current: "  . join ' ', @current;
    } else {
        my @data = map { abs($current[$_]-$previous[$_]) } 0..$#current;
        say join ' ', @data;
        push @final, \@data;
    }
    @previous = @current;
}

print Dumper(\@final) if $debug;

say "Second stage";

foreach my $row (@final) {
    my @data = map { abs(@{$row}[$_]-@{$row}[$_+1]) } 0..$#{$row}-1;
    say join ' ', @data;
}

__DATA__
1 2 3 4
1 4 3 4
1 5 2 3

Вывод

First stage
0 2 0 0
0 1 1 1
Second stage
2 2 0
1 0 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...