0

看到了脚本(见下文),但找不到有关“-n”的更多信息。

my $numeric =0;
my $input = shift;
if ($input eq "-n") {
    $numeric =1;
    $input = shift;
}
my $output = shift;
open INPUT, $input or die $!;
open OUTPUT, ">$output" or die $!;
my @file = <INPUT>;
if ($numeric) {
    @file = sort { $a <=> $b } @file;
} else {
   @file = sort @file;
}
print OUTPUT @file;

解释脚本的文本如下“如果我们在命令行上看到程序名称后的第一件事是字符串-n,那么我们正在执行数字排序。” Google 搜索似乎无法识别大多数“非字母数字”符号,因此"-n"搜索不会产生任何结果。我看到的唯一其他地方"-n"是学习 perl,它说以下“转换后的sed脚本可以在有或没有-n选项的情况下运行”。甚至不确定这是否与"-n"脚本中的相同。知道在哪里可以找到有关的更多信息-n(尽管它可能仅表示数字字符串??仅此而已)

4

2 回答 2

5

此脚本使用的与使用的标志-n完全无关。换句话说,这:-nperl

perl -n script.pl

与此完全不同:

perl script.pl -n

你所拥有的是第二种情况。查看以下文档shift

将数组的第一个值移开并返回,将数组缩短 1 并将所有内容向下移动。如果数组中没有元素,则返回未定义的值。如果省略 ARRAY,则将 @_ 数组移到子例程和格式的词法范围内,并将 @ARGV 数组移到子例程之外以及由 eval STRING 、 BEGIN {} 、 INIT {} 、 CHECK {} 建立的词法范围内、 UNITCHECK {} 和 END {} 构造。

这是满口的,但它的意思是,如果我们不在一个子例程中,并且shift它自己出现,它将获取@ARGV. 是什么@ARGV?让我们看一下perlvar,其中记录了所有这些奇怪的变量:

数组@ARGV 包含用于脚本的命令行参数。

请注意,这些是脚本的参数,而不是perl的参数。因此,如果有人使用 执行您的脚本perl script.pl -n,那么我们可以期望$ARGV[0]成为字符串-n

现在查看您的代码,很明显发生了什么:

my $input = shift;
if ($input eq "-n") {
    $numeric =1;
    $input = shift;
}

他们shift在没有参数的情况下在子例程之外使用来获取@ARGV. 如果是-n,则变量$numeric设置为 1。该变量控制脚本的行为方式。(然后脚本继续获取输入和输出文件的名称@ARGV。)

于 2013-04-08T05:56:35.447 回答
1

它是此脚本本身的命令行参数。如果用户使用脚本名称后跟“-n”来调用它,那么这将告诉脚本如何表现。

于 2013-04-08T04:18:59.573 回答