2014-03-05 110 views
2

我有以下一串代码:字符串比较似乎无效

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从未到达。我的代码在这里有什么问题?这里的字符串比较有问题吗?谢谢。

+0

你们是不是要进入的第一个参数或“”在F1和第二个参数或“”我n f2?如果你尝试||代替 // ? –

回答

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 
} 
+0

我认为我的解决方案的作品,因为当我只传递1参数,'到达这里'将被打印,但似乎文件没有打开(该文件是在那里,并在同一目录中)。 – photosynthesis

+0

@photosynthesis - 如果你只是要传递文件名,让Perl处理文件I/O。查看更新后的答案。 – Kenosis

1

@ARGV会返回no。的参数传递......如果@ARGV == 1,则执行情况1,或者如果@ARGV == 2执行情况2

#!/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

使用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"; 
}