Perl中的字符串比较似乎无效

时间:2014-03-05 05:27:21

标签: perl

我有一堆代码:

my $f1 = $ARGV[0] // '';
my $f2 = $ARGV[1] // '';
print "f1: $f1\n";
print "f2: $f2\n";
if ($f2 eq '') {
    print "reach here\n";
    open(DATA1, $f1) or die $!;
} else {
    open(DATA1, $f2) or die $!;
}

它将从命令行接收1或2个参数,命令行调用将如下所示:

perl perl_unix_wc.pl -l file.txt

或者这个:

perl perl_unix_wc.pl file.txt

我试图定义2个标量来从命令行接收字符串,如果它适用于案例1,那么 '打开(DATA1,$ f2)或死$!'将被调用,否则'打开(DATA1,$ f1)或死$!'会被召唤。但实际上,只执行了案例2,案例1从未到达。这里的代码出了什么问题?这里的字符串比较有问题吗?感谢。

3 个答案:

答案 0 :(得分:2)

使用Getopt::Long处理命令行选项。

use Getopt::Long; # GetOptions

use strict;
use warnings;
use autodie;

GetOptions(
    'l' => \my $opt_l,
);

my $file = shift or die "Filename required";

open my $fh, '<', $file;

if ($opt_l) {
     print "do -l stuff\n";
}

答案 1 :(得分:1)

@ARGV将返回no。传递的参数...如果@ARGV == 1然后执行案例1或者@ARGV == 2执行case2

#!/usr/local/bin/perl
my $f1 = $ARGV[0] ;
my $f2 = $ARGV[1] ;
print "f1: $f1\n";
print "f2: $f2\n";
if (@ARGV == 1) {
    open(DATA1, $f1) or die $!;
} elsif (@ARGV == 2) {
    open(DATA1, $f2) or die $!;
}

如果您想坚持自己的编码风格,请尝试

my $f1 = $ARGV[0] || '';
my $f2 = $ARGV[1] || '';
print "f1: $f1\n";
print "f2: $f2\n";
if ($f2 eq '') {
    open(DATA1, $f1) or die $!;
} else {
    open(DATA1, $f2) or die $!;
}

答案 2 :(得分:1)

由于您似乎不需要-l,只需pop @ARGV use strict; use warnings; @ARGV or die "No arguments passed to $0!\n"; my $file = pop; open my $DATA1, '<', $file or die "Unable to open $file: $!"; ... 的最后一个(或唯一)元素,因为在任何一种情况下,它都是文件名:

use strict;
use warnings;

while(<>){
    # process the file's lines
}

但是,如果您只想传递文件名,则可以执行以下操作:

{{1}}