1

拡張子を持つ複数のファイルがあります.tdx

現在、私のプログラムは を使用して個々のファイルで動作し$ARGV[0]ますが、ファイルの数が増えているため、ファイル拡張子に基づいてワイルドカードを使用したいと考えています。

多くの研究の後、私は途方に暮れています。

ファイルからの抜粋がユーザーによって識別されるように、各ファイルを個別に読み取りたいと思います。

#!C:\Perl\bin\perl.exe

use warnings;

use FileHandle;

open my $F_IN,  '<', $ARGV[0]     or die "Unable to open file: $!\n";
open my $F_OUT, '>', 'output.txt' or die "Unable to open file: $!\n";

while (my $line = $F_IN->getline) {
  if ($line =~ /^User/) {
    $F_OUT->print($line);
  }
  if ($line =~ /--FTP/) {
    $F_OUT->print($line);
  }
  if ($line =~ /^ftp:/) {
    $F_OUT->print($line);
  }
}
close $F_IN;
close $F_OUT;

すべてのファイルは 1 つのディレクトリにあるため、ディレクトリを開く必要があると思います。

ファイルの配列を作成する必要があるのか​​ 、それともリストを作成してむさぼり食う必要があるのか​​ わかりません。

4

4 に答える 4

2

多くのオプションがあります --

  1. をループして@ARGV、ユーザーがファイルのリストを渡すことができるようにします
  2. perl がファイルのリストに展開するパターンを渡すために使用globします (そして #1 のように、そのリストをループします)。シェルが最初に補間しないように、必ず引用する必要があるため、これは面倒です。
  3. 既存のスクリプトを何度も呼び出すためのラッパーを作成します。

から読み取る最初のもののバリアントもあります<>。これは、STDIN に設定されるか、または で指定されたファイルを自動的に開きます@ARGVeof使用方法の例については、を参照してください。

#2の変形として、ディレクトリ名を渡し、 and を使用してリストをループする(拡張子を持つファイルのみを確実に取得するかopendirreaddir少なくとも.and を無視する)か、 orを..追加して使用することができますまた。/*/*.tdxglob

于 2013-11-14T01:23:10.527 に答える
0

glob機能はあなたを助けることができます。ちょうど試して

my @files = glob '*.tdx';
for my $file (@files) {
    # Process $file...
}

リスト コンテキストでglobは、その引数をパターンに一致するファイル名のリストに展開します。詳細については、perlfunc の glob を参照してください。

于 2013-11-14T01:20:08.157 に答える
0

Windows マシンを使用している場合*.tdx、コマンドラインに入力しても機能しない可能性がglobあり、歴史的にシェルのグロビング機能を使用していた可能性もあります。(組み込みglob関数が を使用するFile::Globようになったため、これはもはや問題ではない可能性があります)。

できることの 1 つは、グロブを使用せずに、ユーザーが必要なディレクトリとサフィックスを入力できるようにすることです。次に、 と を使用opendirreaddirて、自分でディレクトリを調べます。

use strict;
use warnings;
use feature qw(say);
use autodie;
use Getopt::Long;      # Why not do it right?
use Pod::Usage;        # It's about time to learn about POD documentation

my @suffixes;  # Hey, why not let people put in more than one suffix?
my @directories;       # Let people put in the directories they want to check
my $help;

GetOptions (
    "suffix=s"     => \@suffixes,
    "directory=s"  => \@directories,
    "help"         => \$help,
) or pod2usage ( -message => "Invalid usage" );

if ( not @suffixes ) {
    @suffixes = qw(tdx);
}

if ( not @directories ) {
    @directories = qw(.);
}

if ( $help ) {
    pod2usage;
}

my $regex = join, "|",  @suffixes;
$regex = "\.($regex)$";   #  Will equal /\.(foo|bar|txt)$/ if Suffixes are foo, bar, txt

for my $directory ( @directories ) {
    opendir my ($dir_fh), $directory;   # Autodie will take care of this:
    while ( my $file = readdir $dir_fh ) {
        next unless -f $file;
        next unless $file =~ /$regex/;
        ... Here be dragons ...
    }
}

これは、ユーザーが入力したすべてのディレクトリを調べてから、各エントリを調べます。ユーザーが入力した接尾辞を使用して(.tdxデフォルトで)、ファイル名と照合するための正規表現を作成します。ファイル名が正規表現と一致する場合は、そのファイルでやりたいことを何でもしてください。

于 2013-11-14T17:52:48.797 に答える