1

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

#!/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我应该使用其他东西而不是我来检索文本。

需要一些帮助!

4

2 回答 2

1

据我了解,您想在第一行之前打印带有文件名的标题,并将它们全部连接到一个新标题。那么单行就足够完成这项任务了。

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

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

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

=== file1.txt ===
one
=== file2.txt ===
one
two
于 2013-05-24T11:02:04.337 回答
1

<*.txt>即使您在评论中这样说,也不会从文件中读取一行。它运行

glob '*.txt'

即while循环遍历文件名,而不是它们的内容。使用 empty<>遍历所有文件。

顺便说一句,$header = undef您可以使用undef $header.

于 2013-05-24T11:05:18.737 回答