有人可以解释这个小的Perl脚本的作用吗?感谢。
#!/usr/bin/perl
my ($file, $from, $to) = @ARGV;
my $fh;
my $matching = 0;
open($fh, $file) or die $!;
while(<$fh>)
{
if(/\Q$from\E/) { $matching = 1; }
if($matching) { print $_; }
if($matching && /\Q$to\E/) { last; }
}
close($fh);
答案 0 :(得分:7)
此脚本有三个参数:
并打印(包括)开始表达式(第二个参数)和结束表达式(第三个参数)之间的所有内容。如果您的文件包含以下内容:
111
222
333
444
555
666
./script.pl filename 333 555
将打印333
,444
和555
。
my ($file, $from, $to) = @ARGV;
此行将命令行参数分配给$file
,$from
和$to
。这显示/提供了所需/不同的命令行参数。
my $fh;
my $matching = 0;
这两行只是声明并初始化后来使用的两个变量。
open($fh, $file) or die $!;
尝试打开第一个传递的参数并将其分配给$fh
,或者如果无法打开文件则退出程序。
while(<$fh>)
{
这只是迭代文件内容
if(/\Q$from\E/) { $matching = 1; }
\Q
和\E
是特定于正则表达式的perl。这可以防止将特殊字符解释为正则表达式。如果当前行包含$from
,则$matching
设置为1。
if($matching) { print $_; }
如果设置了$matching
,则打印当前行
if($matching && /\Q$to\E/) { last; }
如果设置$matching
并且$to
在当前行中,则退出循环
}
close($fh);
关闭文件
答案 1 :(得分:3)
[不是答案,只是一个很长的评论]
将输入文件放在参数列表的末尾更为常见。如果脚本具有调用约定
script from to file
而不是
script file from to
然后脚本可以编写如下:
#!/usr/bin/perl
my $from = shift;
my $to = shift;
while (<>) {
print if /\Q$from\E/ .. /\Q$to\E/;
}
如果省略file
,它的优点是接受来自STDIN的输入。它还具有接受多个文件名的优点。
以下是等效的单线:
perl -ne'BEGIN{($f,$t)=splice(@ARGV,0,2)} print if /\Q$f\E/../\Q$t\E/' file
注意:这两个版本找到所有匹配的部分而不是第一个。我不确定这是否是相关的差异。