数组比较错误消息'Argument'“中的数据元素中的数字不是'

时间:2013-06-21 14:36:17

标签: arrays perl perl-data-structures type-mismatch

我是perl的新手,我正在努力让这个脚本工作。

我已经拍摄了碎片或perl并将它们作为单独的部分工作但是在尝试将它们混合在一起时它失败了。即使显示错误消息,我也找不到我的错误。

工作和完成时的脚本将读取输出文件并通过它部分我的部分并实际生成一个新的输出文件,其中包含一些带有一些附加文本的标题以及该部分中行数的值

我的问题是当它为数组中的每个关键字进行循环时它现在失败,错误消息“Argument”“数组元素中的数字不是'。 Perl将我引导到脚本中的一个部分但我无法看到我如何错误地调用该元素。数组中的所有元素都是alpha,但错误消息是指数值。

任何人都可以看到我的错误。

谢谢

这是脚本

#!/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 

我截断了文件的其余部分

1 个答案:

答案 0 :(得分:10)

  

任何人都可以看到我的错误。

我可以看到很多错误。但我也看到了use strictuse 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
}

我确信当你尝试使用上面的列表时,你问这里的问题就会消失。玩得开心。