使用while语句进行多文本解析和写入,菱形运算符<>和Perl中的$ ARGV变量

时间:2013-05-24 10:51:23

标签: perl text-parsing diamond-operator

我有一些文本文件,在目录中,我想解析他们的内容并将其写入文件。到目前为止,我使用的代码是:

#!/usr/bin/perl

#The while loop repeats the execution of a block as long as a certain condition is evaluated true

use strict; # Always!
use warnings; # Always!

my $header = 1; # Flag to tell us to print the header
while (<*.txt>) { # read a line from a file
    if ($header) {
        # This is the first line, print the name of the file
        **print "========= $ARGV ========\n";**
        # reset the flag to a false value
        $header = undef;
    }
    # Print out what we just read in
    print;
}
continue { # This happens before the next iteration of the loop
    # Check if we finished the previous file
    $header = 1 if eof;
}

当我运行此脚本时,我只获取文件的标题,以及compiled.txt条目。 我还在cmd中收到以下消息:use of uninitialized $ARGV in concatenation <.> or string at concat.pl line 12

所以我想我做错了什么,$ARGV根本就没用过。而不是$header我应该使用其他东西来检索文本。

需要一些帮助!

2 个答案:

答案 0 :(得分:1)

据我所知,你想在第一行之前打印带文件名的标题,并将它们全部连接到一个新标题。然后一个单行就足够完成任务。

它使用变量$.检查第一行并关闭文件句柄以重置其在不同输入文件之间的值:

perl -pe 'printf qq|=== %s ===\n|, $ARGV if $. == 1; close ARGV if eof' *.txt

我的机器中的一个例子产生:

=== file1.txt ===
one
=== file2.txt ===
one
two

答案 1 :(得分:1)

即使您在评论中这样说,

<*.txt>也不会从文件中读取一行。它运行

glob '*.txt'

即。 while循环遍历文件名,而不是遍历其内容。使用空<>迭代所有文件。

BTW,而不是$header = undef,您可以使用undef $header