这个小的Perl脚本有什么作用?

时间:2013-11-29 21:16:34

标签: perl

有人可以解释这个小的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);

2 个答案:

答案 0 :(得分:7)

此脚本有三个参数:

  1. 要读取的文件名
  2. 开始表达
  3. 结束表达
  4. 并打印(包括)开始表达式(第二个参数)和结束表达式(第三个参数)之间的所有内容。如果您的文件包含以下内容:

    111
    222
    333
    444
    555
    666
    

    ./script.pl filename 333 555将打印333444555

    更多详情

    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

注意:这两个版本找到所有匹配的部分而不是第一个。我不确定这是否是相关的差异。