1

私はかなり厄介な perl スクリプトを持っています (私は Perl の第一人者ではありません)。これは次のようなものです。

perl -ane '($h,$m,$s) = split /:/, $F[0];
           $pid = $F[1];
           $args = $F[2]." ".$F[3]." ".$F[4]." ".$F[5]." ".$F[6]." ".$F[7]." ".$F[8]." ".$F[9]." ".$F[10]." ".$F[11]." ".$F[12]." ".$F[13]; 
    if(($h == 1 && $m > 30) || ($h > 1)) {
        print "$h :: $m $kb $pid\nArguments:\n$args\n\n "; kill 9, $pid }'

$argこれらすべての連結を の代わりに、次のようなことを言う方法を探しています$arg=$F[2-end]

それについて何か助けていただければ幸いです:)

ありがとう!

4

4 に答える 4

5
$args = join " ", @F[2..$#F];

$#arraynameの最後の要素のインデックスです@arrayname。で始まり で終わり、その間のすべての要素を含む@arrayname[$start..$end]部分配列を取得します。それらをまとめると、「配列の最後までのすべての要素」が得られます。$arrayname[$start]$arrayname[$end]@F[2..$#F]@F$F[2]

次にjoin、これらすべての配列要素を 1 つの文字列に連結するために使用します。最初の引数は、残りの間に何を入れるかを Perl に伝えます。

于 2012-08-21T20:24:50.573 に答える
3

これは bash でも実行できます。

while read -r time pid args; do
    IFS=: read -r h m s <<< $time
    (( $h*60 + $m > 90 )) && {
        # I don't see where $kb was defined in the original code
        cat <<EOF
$h:$m $kb $pid
ARGUMENTS
$args

EOF
        # Are you sure a more gentle kill won't work?
        # kill -9 should be the last resort for buggy code
        kill "$pid"
    }
done
于 2012-08-21T20:52:58.133 に答える
3

-a utosplitを使用する代わりに、最初に分割されるフィールドの数を制限することを検討してください。

($t, $pid, $args) = split " ", $_, 3;
($h, $m, $s) = split /:/, $t;
于 2012-08-21T20:48:46.830 に答える
0

いつでもプログラムを書くことができます。誰もあなたを嫌うことはなく、あなたのコードを読める人から感謝されるかもしれません。

$kbどこから来たのかは言いませんが、次のようになります

use strict;
use warnings;

while (<>) {
  my ($time, $pid, @args) = split;
  my ($h, $m) = split /:/, $time;
  if ( $h > 1 or $h == 1 and $m > 30 ) {
    print "${h}::$m $kb $pid\n";
    print "Arguments:\n";
    print "@args\n\n";
    kill 9, $pid
  }
}
于 2012-08-22T00:32:11.243 に答える