2

Perl スクリプトのデバッグについてはすでに調査しましたが、探しているものが見つかりませんでした。

ここで私の問題を説明しましょう。

最後にループに入っていないPerlスクリプトがありますが、指示どおりに内部に何も出力していないようです。

だから、シェルスクリプトで見ることができるように、すべての行を1つずつ見るためのより簡単な方法があるかどうか知りたい

set -x

ここに私のPerlスクリプトコードがあります

#!/usr/bin/perl -w

my $ZONEADM = "/usr/sbin/zoneadm list -c";

use strict;
use diagnostics;
use warnings;

system("clear");
print "Enter the app\n";
chomp(my $INS = <>);

print "\nEnter the Symmitrix ID\n";
chomp(my $SYMM = <>);

print "\nEnter the Server\n";
chomp(my $SRV = <>);

print "\nEnter the devices\n";
while (<>) {
  if($_ !~ m/(q|quit)/) {    
    chomp($_);
    my $TEMP_FILE = "/export/home/ptiwari/scripts/LOG.11";
    open (my $FH, '>>', $TEMP_FILE);
    my @arr = split(/:/, $_);
    if($arr[3]) {
      print $FH "/".$INS."db/".$arr[0]."  ".$SYMM."  ".$arr[1]."  ".$arr[2]."  ".$arr[3]."\n";
    }
    else {
      print $FH "/".$INS."db/".$arr[0]."  ".$SYMM."  ".$arr[1]."  ".$arr[2]."\n";
    }
    undef @arr;
    close $FH;
  }
  else {
    exit;
  }
}

my $IS_ZONE = qx($ZONEADM|grep -i $SRV|grep -v global);
if($IS_ZONE) {
  $IS_ZONE = "yes";
}
else {
  $IS_ZONE = "no";    
}    

open(my $FLH, '<', "/export/home/ptiwari/scripts/LOG.11");
my @lines;
while(<$FLH>) {
  my ($GLOBAL_MTPT, $SYM, $SYM_DEV, $SIZE, $NEWFS) = split;
  print $GLOBAL_MTPT."  ".$SYM."  ".$SYM_DEV;
  print "\n";
}

すでに試しperl -dましたが、while ループに入らなかった理由のトラブルシューティングに役立つものは何も表示されませんでした。

4

5 に答える 5

5

あなたのwhile(<>)ループには適切な終了条件がありません。/q|quit/正規表現にはバグがあります。

  1. qいずれかの行にまたはが含まれている場合は、スクリプト全体を終了しますquitquillデバイスの説明にまたはのようなものが含まれている場合も終了しますacquisition。臨時記号を入力した場合の効果はqCtrlC.

  2. ループを終了してスクリプトを続行する唯一の方法は、EOF を送信することです。これには、ユーザーがCtrlDキーボードを打ち込むか、ファイルを単純に終了する必要があります。その後、スクリプト続行されます。

このスクリプトには他にもいくつか間違っている/奇妙なことがあります。主な批判: (a) すべて大文字の変数は、Perl およびプラグマティック モジュール用に非公式に予約されています。小文字または大文字と小文字が混在する変数も機能します。(b) あなたのスクリプトにはかなりの冗長なコードが含まれています。s にリファクタリングするかsub、ロジックを書き直してください

これは、デバッグが容易で、バグの一部が含まれていない可能性がある書き換えの例です。

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

use constant DEBUG_FLAG => 1;  # set to false value for release
my $zoneadm_command = "/usr/sbin/zoneadm list -c";
my $temp_file_name = "/export/home/ptiwari/scripts/LOG.11";

sub prompt { print "\n", $_[0], "\n"; my $answer = <>; chomp $answer; return $answer }
sub DEBUG  { print STDERR "DEBUG> ", @_, "\n" if DEBUG_FLAG }

system("clear");
my $app_name = prompt("Enter the app");
my $symm_id  = prompt("Enter the Symmitrix ID");
my $server   = prompt("Enter the server name");
print "Enter the devices.\n";
print qq(\tTo terminate the script, type "q" or "quit".\n);
print qq(\tTo finish the list of devices, type Ctrl+D.\n);

open my $temp_file, ">>", $temp_file_name
    or die "Can't open log file: $!";

while (<>) {
  chomp; # remove trailing newline
  exit if /^q(?:uit)?$/; # terminate the script if the input line *is* `q` or `quit`. 
  my @field = split /:/;
  # grep: select all true values
  @field = grep {$_} ("/${app_name}db/$field[0]", $symm_id, @field[1 .. 3]);
  print $temp_file join("  ", @field), "\n";
}
close $temp_file;

DEBUG("finished the reading loop");

# get the zones with only *one* extra process
my @zones = 
    grep {not /global/}
    grep {/\Q$server\E/i}
    map  {chomp; $_}
        qx($zoneadm_command);
my $is_zone = @zones ? "yes" : "no";

DEBUG("Am I in the zone? $is_zone");

open my $device_file, "<", $temp_file_name or die "Can't open $temp_file_name: $!";

while (<$device_file>) {
  chomp;
  my ($global_mtpt, $sym, $sym_dev) = split;
  print join("  ", $global_mtpt, $sym, $sym_dev), "\n";
  # or short: print join("  ", (split)[0 .. 2]), "\n";
}
于 2012-12-30T12:15:19.437 に答える
0

スクリプトにステップインするには、次のようなものが必要です。

http://www.devshed.com/c/a/Perl/Using-The-Perl-Debugger/

于 2012-12-30T09:32:42.897 に答える
0

あなたは本当にデバッガーを使うことができます:http://perldoc.perl.org/perldebug.html

ただし、bash -xのようにトレースすることを希望する場合は、次のディスカッションを参照してください: http: //www.perlmonks.org/?node_id=419653

于 2012-12-30T09:34:51.880 に答える
0

Devel::Tracesh -x Perl モジュールは、シェル プログラムのトレースを模倣するように設計されています。

于 2012-12-30T14:37:48.383 に答える
-2

最後の open ステートメントから "my $" を削除し、最後の while ステートメントで "$" を削除してみてください。または、これを試してください:

open(my FLH, '<', "/export/home/ptiwari/scripts/LOG.11");

my @lines = <FLH>;
foreach (@lines) {
    my ($GLOBAL_MTPT, $SYM, $SYM_DEV, $SIZE, $NEWFS) = split;
    print $GLOBAL_MTPT." ".$SYM." ".$SYM_DEV;
    print "\n";
}

結果について教えてください。

于 2012-12-30T11:31:53.813 に答える