Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl中的字符串比较似乎无效_Perl - Fatal编程技术网

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。请参阅更新的答案。