1

私はperlを初めて使用し、このスクリプトを機能させるのに苦労しています。

私は部分またはperlを取り、それらを個別のセクションとして機能するようにしましたが、それらをブレンドしようとすると失敗します。エラーメッセージが表示されても、自分の間違いがどこにあるのかわかりません。

スクリプトは、動作して完了すると、出力ファイルを読み取り、セクションのセクションを通過し、追加のテキストとそのセクションの行数の値を含む見出しだけで、新しい出力ファイルを実用的に生成します。

私の問題は、配列内の各キーワードのループを実行すると、「引数 "" は配列要素の数値ではありません」というエラー メッセージで失敗することです。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 

ファイルの残りの部分を切り捨てました

4

1 に答える 1

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ですか?これらの vars の (許してください) ばかげた名前は、それらが必要ないことを示しています。代わりにこれはどうですか?

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
}

上記のリストに取り組もうとすると、ここで質問した問題が解消されると確信しています。楽しむ。

于 2013-06-22T08:32:30.817 に答える