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将所有这些数组元素连接成一个字符串;第一个参数告诉 Perl 在其余参数之间添加什么。

于 2012-08-21T20:24:50.573 回答
3

不要使用-a utosplit,而是首先考虑限制要拆分的字段数量。

($t, $pid, $args) = split " ", $_, 3;
($h, $m, $s) = split /:/, $t;
于 2012-08-21T20:48:46.830 回答
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 回答
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 回答