2013-06-21 2 views
1

Я очень новичок в perl и изо всех сил пытаюсь заставить этот скрипт работать.Missmatch в сообщении об ошибке сравнения массива «Аргумент» «не является числовым в элементе массива в '

Я взял кусочки или perl и gooten их, чтобы работать как отдельные разделы, но пытаясь объединить их вместе, он терпит неудачу. Даже с сообщениями об ошибках, которые появляются, я не могу найти, где моя ошибка.

Сценарий при работе и завершении читает выходной файл и проходит через него раздел моего раздела и использует новый выходной файл с не более чем заголовком с некоторым дополнительным текстом и значением количества строк в этом раздел.

Мои проблемы в том, когда он выполняет цикл для каждого ключевого слова в массиве, в котором он теперь терпит неудачу, с сообщением об ошибке «Аргумент» «не является числовым в элементе массива в '. Perl направляет меня в раздел в скрипте, но я не вижу, как я неправильно вызываю элемент. Все элементы в массиве являются альфа, но сообщение об ошибке ссылается на числовое значение.

Может ли кто-нибудь увидеть мою ошибку.

Спасибо

Вот сценарий

#!/usr/bin/perl -w 
use strict; 
use warnings; 
use diagnostics; 
# this version reads each variable and loops through the 18 times put only displays on per loop. 

my $NODE = `uname -n`; 
my $a = "/tmp/"; 
my $b = $NODE ; 
my $c = "_deco.txt"; 
my $d = "_deco_mini.txt"; 
chomp $b; 
my $STRING = "$a$b$c"; 
my $STRING_out = "$a$b$d"; 

my @keyword = ("Report", "Last", "HP", "sulog", "sudo", "eTrust", "proftp", "process", "active clusters", "pdos", "syslog", "BNY", "syslogmon", "errpt", "ports", "crontab", "NFS", "scripts", "messages"); 

my $i = 0; 
my $keyword=""; 
my $x=0; 
my $y=0; 
my $jw=""; 

my $EOS = "########################################################################"; 
my $qty_lines=0; 
my $skip5=0; 
my $skipcnt=0; 
my $keeplines=0; 
my @HPLOG=""; 

do { 
    print "Reading File: [$STRING]\n"; 

    if (-e "$STRING" && open (IN, "$STRING")) { 
#  ++$x;        # proving my loop worked 
#  print "$x interal loop counter\n"; # proving my loop worked 
     for (++$i) { # working 
      while (<IN>) { 
       chomp ; 
       #if ($_ =~ /$keyword/) { 
       #if ($_ =~/$i /) { 
       #if ($_ =~ /$keyword[ $i ]/) { 
       if ($_ =~ /$keyword $i/) { 
        print " $i \n"; 
        $skip5=1; 
        next; 
#     print "$_\n";# $ not initalized error when tring to use it 
       } 

       if ($skip5) { 
        $skipcnt++; 
        print "SKIP LINE: $_\n"; 
        print "Header LINE: $_\n"; 
        next if $skipcnt <= 5; 
        $skip5=0; 
        $keeplines=1; 
       } 

       if ($keeplines) { 
#     ++$qty_lines;    # for final output 
        last if $_ =~ /$EOS/; 
        print "KEEP LINE: $_\n"; 
#     print "$qty_lines\n";  # for final output 

        push @HPLOG, "$_\n"; 
        # push @HPLOG, "$qty_lines\n";# for final output 
       } 
      } ## end while (<IN>) 
     } ## end for (++$i) 
    } ## end if (-e "$STRING" && open (IN, "$STRING")) 

    close (IN); 
} while ($i < 19 && ++$y < 18); 

Вот типовой раздел или входной файл. ################################################################################################################ ##############################

     Checking for active clusters. 

           @@@@@@@@@ 

    root 11730980 12189848 0 11:24:20 pts/2 0:00 egrep hagsd|harnad|HACMP|haemd 

If there are any processes listed you need to remove the server from the cluster. 

############################################################################ 

         This is the output from Pdos log 

Please review it for anything that looks like a users may be trying to run something. 

           @@@@@@@@@ 

         This server is not on Tamos 

############################################################################ 

         This is the output from syslog.conf. 

Look for any entries on the right side column that are not the ususal logs or location. 

           @@@@@@@@@ 

# @(#)34 1.11 src/bos/etc/syslog/syslog.conf, cmdnet, bos610 4/27/04 14:47:53 
# IBM_PROLOG_BEGIN_TAG 
# This is an automatically generated prolog. 
# 
# bos610 src/bos/etc/syslog/syslog.conf 1.11 

Я усеченный остальную часть файла

+0

Добро пожаловать в Переполнение стека. Нет, мы не можем видеть вашу ошибку. Включите свой код с вашим вопросом. – mob

+0

Да, я вижу вашу ошибку. Вы спрашиваете о коде, который вы не показывали. – TLP

+0

Вот сообщение об ошибке вывода, поскольку оно терпит неудачу. – CharlieB

ответ

10

Может ли кто-нибудь увидеть мою ошибку.

Я вижу довольно много ошибок. Но я также вижу некоторые хорошие вещи, такие как use strict и use warnings.

Мое предложение для вас - это работать с вашим стилем кодирования, чтобы вам и другим легче отлаживать любые проблемы.

Именование переменных

my $NODE = `uname -n`; 
my $a = "/tmp/"; 
my $b = $NODE ; 
my $c = "_deco.txt"; 
my $d = "_deco_mini.txt"; 
chomp $b; 
my $STRING = "$a$b$c"; 
my $STRING_out = "$a$b$d"; 

Почему некоторые из этих имен все прописные и другие все в нижнем регистре? Если вы создаете имя файла, почему вы вызываете переменную, содержащую имя файла $STRING?

my @keyword = ("Report", "Last", "HP", "sulog", "sudo", .... 

Если у вас есть список из нескольких ключевых слов, не было бы склонен не выбрал особой для имени переменной? Как насчет @keywords?

Использование временных переменных, которые не нуждаются в

my $NODE = `uname -n`; 
my $a = "/tmp/"; 
my $b = $NODE ; 
my $c = "_deco.txt"; 
chomp $b; 
my $STRING = "$a$b$c"; 

Зачем вам нужен $a, $b и $c? Глупые имена этих проклятых имен (простить) - это контрольный знак, что они вам не нужны. Как насчет этого?

my $node_name = `uname -n`; 
chomp $node_name; 
my $file_name = sprintf '/tmp/%s/_deco.txt', $node_name; 

Ваша самая большая проблема: вы не имеете ни малейшего представления о том, как использовать массивы

Вы делаете несколько резких ошибок, когда речь идет о массивах.

my @HPLOG=""; 

Вы хотите массив или другую строку? @ говорит массив, "" говорит строку. Думаю, вам нужен новый пустой массив, поэтому my @hplog =() было бы намного лучше. Но так как нет необходимости говорить perl, что вы хотите пустой массив, так как он все равно даст вам пустое место, my @hplog; выполнит эту работу просто отлично.

Это мне потребовалось некоторое время, чтобы выяснить это следующий, и я до сих пор не уверен ли я угадал ваши намерения правильно:

my @keyword = ("Report", "Last", "HP", "sulog", "sudo", "eTrust", "proftp", "process", "active clusters", "pdos", "syslog", "BNY", "syslogmon", "errpt", "ports", "crontab", "NFS", "scripts", "messages"); 
... 
       if ($_ =~ /$keyword $i/) { 

Что я думаю вы здесь делаете пытаетесь сопоставьте свою текущую строку ввода с номером элемента $i в @keywords. Если мое предположение верно, то вы действительно хотели сказать:

if (/$keyword[ $i ]/) { 

переборе массивов

Perl не является C. Это не заставит вас прыгать через обручи, чтобы получить петлю.

Просто посмотрите на все код, который вы написали цикл по вашим ключевым словам:

my $i = 0; 
... 
     for (++$i) { # working 
... 
       if ($_ =~ /$keyword $i/) { 
... 
} while ($i < 19 && ++$y < 18); 

Помимо фактов, что ваш working комментарий просто самообман и что вы жестко закодировано число элементов в вашем массив, вы могли бы просто использовали for-each цикл:

foreach my $keyword (@keywords) { 
    # more code here 
} 

Я уверен, что, когда вы пытаетесь работать в приведенном выше списке, то проблема, что заставило вас спросить здесь будет просто уйти. Повеселись.