我有一堆代码:
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 :(得分: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}}