-2

ircボットで次のことをしようとしているPERLスクリプトの助けが必要です:

  • ユーザーコマンドで、ファイルが存在するかどうかを確認します。
  • 存在しない場合は、新しいファイルを作成し、値「1」を出力します。
  • 存在する場合は、次の段階に進みます。
  • ファイル内のファイル情報を取得します。これは数値です。
  • information + 1 次に、同じ名前の新しいファイルに出力します。

ここにスクリプトがあります:

        my ($who,$channel,$message) = @_;
my @things = split(' ', $message);
            my @args = @things[1..$#things];

        if ($message =~ /^&cookie/i && @args[0..$#args]) {

    if ( -s '@args[0..$#args].txt') { $varr = 1; goto varrr;
    } else {
    open (USER, ">", "@args[0..$#args].txt") or die "failed: $!";
    my $sum = 1;
    print USER "$sum";
    close (USER);
    }
       varrr:
       if ($varr == 1) {
    open (USER, "<@args[0..$#args].txt");
    while (my $use = <USER>) {
    my $sum = 1;
    my $newuse = ($use + $sum);

    close (USER);

    open (USER, ">@args[0..$#args].txt");
    my $usee = $use + 1;
    print USER "$newuse\n";
    close (USER);
    print $sock "PRIVMSG $channel :You have given @args[0..$#args] a cookie! \n";
    $varr = 0;
    }
    }
    }
    elsif ($message =~ /^&cookie/i) {
    print $sock "PRIVMSG $channel :Invalid parameter, use &cookie [name]. \n";
    }

編集:

修正されました、後藤は残らなければなりませんでした、ありがとうございます:)

[編集]

D: 私がテストしたものと呼ばれるファイルがあったに違いありません。ファイルが存在しない場合は、ファイルが作成されなくなります。perl を使ったのは 3 日間だけです。

も試しました:

        if ($message =~ /^&cookie/i && @args[0..$#args]) {

unless ( -s '@args[0..$#args].txt') { $varr = 1;
} else {
open (USER, ">", "@args[0..$#args].txt") or die "failed: $!";
my $sum = 1;
print USER "$sum";
close (USER);
}
   varrr:
   if ($varr == 1) {
open (USER, "<@args[0..$#args].txt");
while (my $use = <USER>) {
my $sum = 1;
my $newuse = ($use + $sum);

close (USER);

open (USER, ">@args[0..$#args].txt");
my $usee = $use + 1;
print USER "$newuse\n";
close (USER);
print $sock "PRIVMSG $channel :You have given @args[0..$#args] a cookie! \n";
$varr = 0;
}
}
}
4

1 に答える 1

1

最初の条件で文字列補間を使用しようとしています'@args[0..$#args].txt'。perl は、二重引用符または を使用している場合にのみ補間しqw//ます。@args[0..$#args].txtこれは、args の値ではないという名前のファイルの存在をチェックしていることを意味します。@args[0..$#args]文字列がフィールド内にある場合にスペースで結合される配列スライスです。これにより、一部のファイル システムで問題が発生する可能性があります。

また、一部のファイル システムでは長さ 0 のファイルが存在する可能性があるため、ファイルの存在を確認するには -s ではなく -e を使用することをお勧めします。関数を変更せずにコードを 2 番目の条件から最初の条件に移動できるため、$varr 変数は不要です。

于 2013-01-11T22:16:07.960 に答える