Доступ / изменение массива в Perl - PullRequest
0 голосов
/ 23 февраля 2012

Есть ли способ, когда мы помещаем элемент в массив, можем ли мы поместить его в определенные столбцы.

Я пытаюсь сделать что-то подобное.

push (@array, $val ); .......$val should always go to first column.
push (@array, $val2); .......$val2 should go to second column
push (@array, $val3);........$val3 should go to third 

Я пыталсядавая \ t, но не получил правильных результатов.

elsif ($line =~/RELATION/){
push (@mystuff, "$line" .",");
$line = &getline;
}

Мой пример текстового файла выглядит следующим образом

SEVERITY Warning
NODE OTHER "awssystem"
APPLICATION "AWS"
MSGGRP "OpC"
OBJECT "Audit"
MSGKEY "<$MSG_NODE>:hello"
ACK  "<$MSG_NODE>:hello"
TEXT "Test one two three"
AUTOACTION "echo \"It has to ack after AA\" > /tmp/banack" ACTIONNODE IP 0.0.0.0  "<$OPC_MGMTSV>" ANNOTATE ACK
                      OPACTION "echo `hostname`" ANNOTATE
                      TROUBLETICKET
                      HELPTEXT "Hello what is this"

SEVERITY Warning
NODE OTHER "awssystem"
MSGGRP "OpC"
OBJECT "Audit"
MSGKEY "<$MSG_NODE>:hello"
MSGKEYRELATION ACK  "<$MSG_NODE>:hello"

У меня есть много подобных записей в моем текстовом файле.Я пытаюсь захватить только Severity, application, msggrp и object, в указанном выше приложении вывода отсутствует, поэтому мне просто нужно поставить пробел, если он не может найти приложение.

Мой код выглядит следующим образом:

while ($#myarr > 0 )
-------
---
elsif ($line =~/SEVERITY/){
push (@mystuff, "$line" .",");
$line = &getline;
}

Я хочу, чтобы мой вывод был выглядеть следующим образом

SEVERITY Warning APPLICATION "AWS" MSGGRP "OpC"
SEVERITY Warning                   MSGGRP "OpC"

Но мой вывод выглядит так

SEVERITY Warning APPLICATION "AWS" MSGGRP "OpC"
SEVERITY Warning MSGGRP "OpC"

Ответы [ 3 ]

1 голос
/ 23 февраля 2012

Как насчет:

#!/usr/bin/perl
use strict;
use warnings;

my %res;
my @res;
while(<DATA>) {
    chomp;
    if (/(SEVERITY)/) {
        push @res,{%res} if $.>1;
        %res = map{$_ => ''}qw/APPLICATION MSGGRP/;
        $res{$1} = $_;
    } elsif (/(APPLICATION|MSGGRP)/) {
        $res{$1} = $_;
    }
}
push @res,{%res};

foreach my $res(@res) {
format STDOUT = 
@<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<< @<<<<<<<<<<<<<<<<<<<<
$res->{SEVERITY}, $res->{APPLICATION}, $res->{MSGGRP}
.
write;
}

__DATA__
SEVERITY Warning
NODE OTHER "awssystem"
APPLICATION "AWS"
MSGGRP "OpC"
OBJECT "Audit"
MSGKEY "<$MSG_NODE>:hello"
ACK  "<$MSG_NODE>:hello"
TEXT "Test one two three"
AUTOACTION "echo \"It has to ack after AA\" > /tmp/banack" ACTIONNODE IP 0.0.0.0  "<$OPC_MGMTSV>" ANNOTATE ACK
                      OPACTION "echo `hostname`" ANNOTATE
                      TROUBLETICKET
                      HELPTEXT "Hello what is this"

SEVERITY Warning
NODE OTHER "awssystem"
MSGGRP "OpC"
OBJECT "Audit"
MSGKEY "<$MSG_NODE>:hello"
MSGKEYRELATION ACK  "<$MSG_NODE>:hello"

вывод:

SEVERITY Warning      APPLICATION "AWS"     MSGGRP "OpC"
SEVERITY Warning                            MSGGRP "OpC"
0 голосов
/ 23 февраля 2012

IIUC:

push(@array, $val, $val2, $val3)

0 голосов
/ 23 февраля 2012

Что вы подразумеваете под «push to column»?

Вы можете сохранить значение в определенной позиции в массиве

$array[0] = $val ;  # $val is 1. element
$array[1] = $val2 ; # $val2 is 2. element
$array[2] = $val3 ; # ...

Это то же самое, что и

* 1007.*

при условии, что @array ранее был пуст.

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