脚本中的“-n”是什么?

时间:2013-04-08 04:11:47

标签: perl

看到了脚本(见下文),但找不到更多关于“-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的更多信息(尽管它可能仅仅意味着一个数字字符串?没有其他更多)

2 个答案:

答案 0 :(得分:5)

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

perl -n script.pl

完全不同于此:

perl script.pl -n

你拥有的是第二种情况。请查看shift的文档:

  

关闭数组的第一个值并返回它,缩短了   数组1并将所有内容向下移动。如果没有元素   array,返回未定义的值。如果省略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中获取输入和输出文件的名称。)

答案 1 :(得分:1)

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