2013-04-08 268 views
0

看到脚本(见下文),但无法找到更多关于“-n”的信息。脚本中的“-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更多信息(虽然它可能只是一个数字字符串??没有别的更多)

回答

5

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

perl -n script.pl 

从此完全不同:

perl script.pl -n 

你有什么是第二种情况。看一看的文档shift

档阵列的第一个值开始并返回它,由1缩短 阵列和移动都记录下来。如果 数组中没有元素,则返回未定义的值。如果省略了ARRAY,则将子例程和格式的词法范围内的@_ 数组以及子例程外部的 @ARGV数组以及由eval STRING,BEGIN {},INIT {}等语言创建的词法范围 CHECK {}, UNITCHECK {}和END {}构造。

这是一个mouthfull,但就是它的意思是说,如果我们在一个子程序不是和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

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

+0

仍然困惑。脚本究竟应该如何表现?即带或不带-n,有什么区别? – 2013-04-08 04:29:41

+1

“-n”只是脚本的创建者选择表示输入文件应该按照数字排序而不是字母数字排序。它与任何其他程序的命令行参数无关。作者本来可以很好地选择“-i”或“--sort_numerically” – imran 2013-04-08 04:35:53

+1

你不会在互联网上找到它。你找到的代码评论解释了它。它对文件进行排序。假设该脚本被称为“分拣机”。然后,如果他们在命令行上写入“sorter infile outfile”,它将读取infile中的每一行,按字母顺序对它们进行排序,然后将结果写入outfile。但是,如果他们写入“sorter -n infile outfile”,那么它将读取行并将它们排序为数字而不是字符串。 – 2013-04-08 04:36:38