【问题标题】:Copying files that starts with numbers to another directory将以数字开头的文件复制到另一个目录
【发布时间】:2014-09-11 00:50:49
【问题描述】:

我已经解决了 #1,但还剩下 2 个问题。 谁能帮帮我?

  1. 从本地目录中,列出所有以数字 (0..9) 开头的文件以及哪个文件 扩展名为 .song

  2. 创建子目录“local dir/selected”,之后您将在其中复制这些文件中的每一个 为每一行中的每一行(非空白)编号。

  3. 在名为 stats.txt 的文件中打印出有关每个文件的以下信息: a) (非空白)行数。 b) 段落数。这里的段落是由非空行组成的文本块,并且 在文件的开头和结尾由文件的开头、文件的结尾或 由一个空行。 c) 段落的平均大小(以行数计)。 d) 如果是或否,文件中的所有段落都具有相同的长度。 奖励问题: e) 检测每个文件中存在的每个押韵。 f) 给出押韵行数占总行数的比例。

对于#1:

#!/usr/bin/perl
use strict;
use warnings;

my $directory = '/local_dir';

opendir (DIR, $directory) or die $!;

while (my $file = readdir(DIR))
{
  # Use a regular expression to find files ending in .song.txt
  next unless ($file =~ m/\.song.txt$/);

  print "$file\n";
}

closedir(DIR);
exit 0;

【问题讨论】:

  • 我看不到您的脚本当前如何查找以数字开头的文件。
  • 我想知道您是否尝试过我的解决方案。如果是这样,它有效吗?

标签: perl


【解决方案1】:

第一步和第二步的步骤如下:

#!/usr/bin/env perl
use strict;
use warnings;
use autodie;

my $src_dir = '';
my @files = glob $src_dir . qq([0-9]*.song.txt);

my $dest_dir = 'selected';
mkdir $dest_dir;

for my $file (@files) {
    open my $fin, "<", $file;
    open my $fout, ">", "$dest_dir/$file";
    my $c = 1;
    while (<$fin>) {
        $_ = $c++ . " $_" unless /^$/;
        print $fout $_;
    }
}

您可以使用glob 查找感兴趣的文件,而不是使用opendir,以数字[0-9] 开头并以.song.txt 结尾。创建输出目录后,for 循环遍历这些文件并在目标目录中创建一个同名的新文件。 while 循环遍历输入文件的每一行。如果它不是空白,它会在每行的开头添加一个数字,即行的开头没有紧跟行的结尾/^$/。然后它将该行写入新文件。

至于第三步,我认为值得您自己尝试一下,如果遇到困难,请提出一个新问题。

【讨论】:

    猜你喜欢
    • 2012-02-15
    • 2017-11-18
    • 2013-06-01
    • 2020-06-22
    • 2014-08-12
    • 2013-10-24
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多