Perl脚本使用-w开关,但不是没有

时间:2011-06-11 01:09:48

标签: perl warnings switch-statement

此脚本适用于具有-w开关的localhost但不能没有。它在use strictuse warning处于活动状态时也有效。

的apache2 / error.log中:

没有开关(中止脚本):

(2)No such file or directory: exec of ... failed

我得到了开关:

Use of uninitialized value $email_flag in string ne ...

看起来很初我。

在实时网络服务器上都没有人工作。 Perl对我来说很新,但我知道一些BASH和PHP。

我运行Debian Lenny,Apache2,Perl 5.10。

#!/usr/bin/perl -w

$| = 1;

my $mailprog = '/usr/sbin/sendmail'; # where the mail program lives

my $to = "not\@for.you";   # where the mail is sent

my ($command,$email,@pairs,$buffer,$pair,$email_flag) ;

 read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});

        @pairs = split(/&/, $buffer);
       foreach $pair (@pairs) {

        # Split the pair up into individual variables.                       #
        my($name, $value) = split(/=/, $pair);

        # Decode the form encoding on the name and value variables.          #
        $name =~ tr/+/ /;
        $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;

        # If they try to include server side includes, erase them, so they
        # aren't a security risk if the html gets returned.  Another 
        # security hole plugged up.
        $value =~ s/<!--(.|\n)*-->//g;

     ##  print "Name of form element is $name with value of $value \n";

        if ($name eq 'email') {
            $email = $value;
           }

        if ($name eq 'command') {
            $command = $value;
           }

       }

    if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ ||
        $email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/ ) {
        $email_flag = "ERROR";

    }

my $urlcommand = $command;


if ($command eq 'Subscribe') {
$command = "SUBSCRIBE rpc-news";
}

if ($command eq 'Unsubscribe') {
$command = "UNSUBSCRIBE rpc-news";
}

if ($command eq 'Suspend') {
$command = "SET rpc-news NOMAIL";
}

if ($command eq 'Resume') {
$command = "SET rpc-news MAIL";
}

my $getInfo = '';

print "Content-Type: text/html\n";

  if ($email_flag ne "ERROR") {

    open(MAIL,"|$mailprog -t");
     print MAIL "To: $to\n";
     print MAIL "From: $email\n";
     print MAIL "Subject: [rpc-news] $command \n";
     print MAIL "Reply-to: $email \n";

     print MAIL "$command \n";
     print MAIL "EXIT \n";
    close (MAIL);

    $getInfo = "?result=good";
   }
if ($email_flag eq "ERROR") {
    $getInfo = "?result=bad";
}   

my $rootURL= $ENV{'SERVER_NAME'};
my $url = "http://${rootURL}/thank_you.html${getInfo}&action=${urlcommand}";

print "Location: $url\n\n";

3 个答案:

答案 0 :(得分:7)

您是否在Windows计算机上创建脚本并将其上载到Linux服务器而不修复行结尾?如果没有-w开关,shebang行可能看起来像“#!/usr/bin/perl\r”,因此系统会寻找名为“perl \ r \ n”的程序(或者行结束看起来)。使用-w开关,“#!/usr/bin/perl”没有难以理解的行结尾。相反,它会被卡在-w不会导致失败的地方。

我认为有一个关于此的问题,但我现在似乎无法在文档中找到它。

更新:我在PerlMonks上找到了它,在一个非常古老的Q&amp; A主题中看起来似乎无关,直到你阅读了消息正文:Answer: How to get rid of premature end of script headers。是的,我知道,如果你只是浏览线程,你甚至不会停止那个。但这是帖子的文字:

  

如果你开发了这个脚本   Windows,它可能是脚本   file具有非UNIX行结尾。 (该   perl解释器可以处理它们,但是   shebang线被解释   贝壳,并不容忍   错误的行结尾。)如果是这样的话   问题,脚本可能会终止   在shebang有一个错误   线。

答案 1 :(得分:3)

  

Use of uninitialized value $email_flag in string ne ...

     

看起来很初我。

 if ($email =~ /(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/ ||
     $email !~ /^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/
 ) {
     $email_flag = "ERROR"; 
 }

$ email_flag仅在模式匹配时才会在此处初始化 - 否则它将保持未定义状态。您可以添加else子句以确保无论如何都会初始化。

答案 2 :(得分:0)

我不会使用该代码,它不使用CGI.pm(或CGI :: Simple ...) 从“nms - 专家撰写的网络程序”中获取“TFMail - 改进形式邮件”

安装简单,编写得很好(它使用CGI ......)