@ARGV 参数如何只限定一个 请教各位

谢谢!
可我本来就是在linux下跑的。
另外,也没有不停地输入“错误的日期“,$^I=".$date.bak"; 是备份文件的后缀。


期待各位指导!


QUOTE:
原帖由 ynchnluiti 于 2008-11-13 12:43 发表
chomp (my $input=);
不需按ctrl+D结束,但标准输入已打开,while前没有关闭。
不知道是不是这么说的。

不是这个原因。
是因为“<>”是带魔法的。
如果用“<STDIN>”就没事。

楼主误以为“<>”和“<STDIN>”是等效的,其实不是。

这也算是 Perl 的一个小小的陷阱吧。
入门了就不会犯这种错误了。
我的代码,问题也是出在chomp (my $input=<>);这个语句上。

测试下边的代码,就直接输出了。
#!/usr/bin/perl -w

#print "Please input:\n";
#chomp (my $input=<>);
@ARGV="txt";
#chomp (my $date=`date +%Y%m%d%H%M%S`);
#$^I=".$date.bak";
while (<>) {
        #       s/^($input).*\n//;
                print;
}
add_bras.pl
#!/usr/bin/perl -w

print "Please input:\n";
chomp (my $input=<>);                     同 chomp (my $input=<STDIN>);
open (FILE,">> txt");
print FILE "$input\n";
close FILE;



del_bras.pl

#!/usr/bin/perl -w

print "Please input:\n";
chomp (my $input=<STDIN>);                            不同于 chomp (my $input=<>);    为什么???     
@ARGV="txt";
chomp (my $date=`date +%Y%m%d%H%M%S`);
$^I=".$date.bak";
while (<>) {
                s/^($input).*\n//;
                print;
}

自我参考:

Since the diamond operator is generally used to process all of the input, it's typically a mistake to use it in more than one place in your program. If you find yourself putting two diamonds into the same program, especially using the second diamond inside the while loop that is reading from the first one, it's almost certainly not going to do what you want.
  • In our experience, when beginners put a second diamond into a program, they meant to use $_ instead. Remember, the diamond operator reads the input, but the input itself is generally found in $_ (by default).

    • If you re-initialize @ARGV before using the second diamond, then you're on solid ground. We'll see @ARGV in the next section.


  • QUOTE:
    原帖由 flw 于 2008-11-13 13:29 发表

    不是这个原因。
    是因为“”是带魔法的。
    如果用“”就没事。

    楼主误以为“”和“”是等效的,其实不是。

    这也算是 Perl 的一个小小的陷阱吧。
    入门了就不会犯这种错误了。



    QUOTE:
    由于钻石操作符通常会处理所有的输入,所以当它在程序里出现好几次时,通常是错误的......
    【注10】:在使用第2个钻石操作符之前,若能重新指定@ARGV的内容,那就没什么问题了。

    楼主的代码确实符合【注10】的说法呀。首个<>检查@ARGV,发现为空,则使用标准输入流。后面也重新定义了@ARGV的内容。为何还会出错?我在WIN32平台运行的,程序处理首个<>时,我从键盘输入,接着一路ENTER,屏幕一直提示输入,无法处理后面的程序。WHY?
    我想在书上找到确确的说法,否则心不安



    QUOTE:
    The <> symbol will return "undef" for end-of-file only once. If you call
    it again after this, it will assume you are processing another @ARGV
    list, and if you haven't set @ARGV, will read input from STDIN.

    以上摘自 perldoc。
    虽然说的不是很明确,但是应该注意到 end-of-file 是个关键。
    愚钝,不明白您”end-of-file是关键“和上面的程序有何关系。抓住问到底
    以下代码内容及运行情况如下:

    -bash-3.00# cat gaochong
    #!/usr/bin/perl -w

    use strict;

    chomp (my $date=`date +%Y%m%d%H%M%S`);
    my $file="/export/home/boss/ua/bin/gaochong.txt";
    my $file_bak="$file" . ".add_$date.bak";
    system ("cp $file $file_bak");
    print "Please input the bras that you will add and press Enter:";
    chomp (my $input=<STDIN>);
    open (FILE,">> $file");
    print FILE "$input\n";
    close FILE;
    -bash-3.00# gaochong
    Please input the bras that you will add and press Enter:pop600
    -bash-3.00#


    而我修改了用户的.bash_profile,如下:
    exec noc_core_gaochong


    -bash-3.00# cat /bin/noc_core_gaochong
    #!/bin/bash
    /export/home/boss/ua/bin/gaochong


    然后以这个用户登录,运行情况却如下,为什么?请教各位!
    以下代码内容及运行情况如下:

    -bash-3.00# cat gaochong
    #!/usr/bin/perl -w

    use strict;

    my $file="/export/home/boss/ua/bin/gaochong.txt";
    print "Please input the bras that you will add and press Enter:";
    chomp (my $input=<STDIN>);
    open (FILE,">> $file");
    print FILE "$input\n";
    close FILE;

    -bash-3.00# gaochong
    Please input the bras that you will add and press Enter:pop600
    -bash-3.00#


    而我修改了用户的.bash_profile,如下:
    exec noc_core_gaochong


    -bash-3.00# cat /bin/noc_core_gaochong
    #!/bin/bash
    /export/home/boss/ua/bin/gaochong


    然后以这个用户登录,运行情况却如下,为什么?请教各位!


    login: core
    Password:
    Last login: Fri Nov 14 17:49:50 from 10.0.0.21
    Sun Microsystems Inc.   SunOS 5.10      Generic January 2005
    Please input the bras that you will add and press Enter:POP300
    print() on closed filehandle FILE at /export/home/boss/ua/bin/gaochong line 12, <STDIN> line 1.


    失去了跟主机的连接。