看到了脚本(见下文),但找不到更多关于“-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
的更多信息(尽管它可能仅仅意味着一个数字字符串?没有其他更多)
答案 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”调用它,那么将告诉脚本如何表现。