我需要帮助处理PERL脚本,我试图在irc机器人上执行以下操作:
这是脚本:
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";
}
编辑:
修复,goto必须保留,谢谢你们:)
[edit]
D:我必须有一个名为我测试它的文件,如果文件不存在,它现在不再创建文件,现在是什么?我只有3天的perl经验。也尝试过:
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;
}
}
}
答案 0 :(得分:1)
你试图在第一个条件'@args[0..$#args].txt'
中使用字符串插值。 perl仅以双引号或使用qw//
进行插值。这意味着您正在检查是否存在名为@args[0..$#args].txt
的文件而不是args的值。 @args[0..$#args]
是一个数组切片,当字符串输入时将与空格连接。这可能会导致某些文件系统出现问题。
最好使用-e而不是-s来检查文件存在,因为在某些文件系统上可能有0长度文件。 $ varr varriable是不必要的,因为您可以将代码从第二个条件移动到第一个条件而不会改变函数。