检查文件是否存在,如果不存在,则PERL

时间:2012-12-30 00:34:22

标签: perl


我需要帮助处理PERL脚本,我试图在irc机器人上执行以下操作:

  • on user command查看文件是否存在。
  • 如果不存在,则创建新文件,然后打印值" 1"。
  • 如果存在转到下一阶段。
  • 获取文件中的文件信息,这是一个数字。
  • 信息+ 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";
    }

编辑:

修复,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;
}
}
}

1 个答案:

答案 0 :(得分:1)

你试图在第一个条件'@args[0..$#args].txt'中使用字符串插值。 perl仅以双引号或使用qw//进行插值。这意味着您正在检查是否存在名为@args[0..$#args].txt的文件而不是args的值。 @args[0..$#args]是一个数组切片,当字符串输入时将与空格连接。这可能会导致某些文件系统出现问题。

最好使用-e而不是-s来检查文件存在,因为在某些文件系统上可能有0长度文件。 $ varr varriable是不必要的,因为您可以将代码从第二个条件移动到第一个条件而不会改变函数。