Perl中的字符串比较似乎无效
我有以下代码:Perl中的字符串比较似乎无效,perl,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
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,则
“openDATA1、$f2或die$!”将被调用,否则为“openDATA1、$f1或die$!”威尔被叫去了。但在实践中,只有案例2被执行,案例1从未到达。我的代码有什么问题?这里的字符串比较有问题吗?谢谢。@ARGV将返回传递的参数数。。。如果@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 $!;
}
@ARGV将返回传递的参数数。。。如果@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 $!;
}
用于处理命令行选项
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";
}
用于处理命令行选项
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";
}
由于您似乎不需要-l,只需将@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
}
由于您似乎不需要-l,只需将@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
}
您是在尝试输入第一个参数,还是在f1和第二个参数中,还是在f2中?您是否应该尝试| |而不是//?您是在尝试输入第一个参数,还是在f1和第二个参数中,还是在f2中?您是否应该尝试| |而不是//?我认为我的解决方案是可行的,因为当我只传递1个参数时,“到达此处”会被打印出来,但文件似乎没有打开文件在那里并且在同一个目录中。@光合作用-如果您只传递文件名,让Perl处理文件I/o。查看更新后的答案。我认为我的解决方案是可行的,因为当我只传递1个参数时,“到达此处”会被打印出来,但文件似乎没有打开文件在那里并且在同一个目录中。@光合作用-如果你只传递文件名,让Perl处理文件I/o。请参阅更新的答案。