0
**LIST.txt**
lambo
audi
bmw
merc
ferrari

LISTは車の名前を含むファイルであり、DETAILSはLIST.txtで指定された車の詳細を含むファイルです。

**DETAILS.txt**
lambo_1 gallardo lp570
lambo_2 aventador lp700
lambo_3 reventon lp640
audi_1 R8 V10
audi_2 A8 diesel 
bmw_1 Z4 blue
bmw_2 M3 red
bmw_3 328i black
merc_1 slr mclaran
merc_2 sls wings

各車の詳細を異なるファイルに分割したい。つまり、この場合は、file_1.txt、file_2.txt、file_3.txt、file_4.txtなどの異なるファイルにlambo、audi、bmwおよびmercの詳細を含む4つのファイルが必要です。

file_1.txt
 lambo_1 gallardo lp570
    lambo_2 aventador lp700
    lambo_3 reventon lp640

同様に他のファイルも

私はperlに不慣れで、あなたの助けが欲しいです。各要素を検索してファイルに保存することでこれを試みました(ファイル名を変更するためのカウンター)が、期待した結果が得られません。だから誰でも私を助けることができます。

  use strict;
  use warnings;    
  my $counter;    
  open  my $fh, "<", "F1.txt" or die $!;  
  open  my $fh1, "<", "F2.txt" or die $!;    
  my @b = <$fh>;  my @a = <$fh1>;
  for (@b)  
  {        
    my $line1 = $_;         
    for (@a)        
    {              
      $line2 = $_;              
      if ($line1 =~ /^$line2$/)              
      {        
        $counter++;                    
        open my $outfile, ">>", "A_${counter}.txt";                    
        print $outfile $line2;                    
        close $outfile;              
      }   
    } 
  }

私はこのようなことをしようとしていますが、必要に応じて適切な答えが得られません

4

3 に答える 3

2

これは、多重化の基本的な演習です。中級Perlの例もあります(そして印刷版は今日棚に並んでいます)。

車の種類ごとに1つずつ、一連​​の書き込みファイルハンドルを開いてハッシュに保存し、遭遇したときに必要なものを検索できます。これには、詳細を複数回スキャンする(および全体をメモリに読み込む)他の回答とは異なり、詳細を1回スキャンするという利点があります。

最初の部分では、mapを使用して、 list.txt内の車に基づいて出力ファイルハンドルのハッシュを作成します。

use v5.14;

my %out_fhs = do {
    open my $list_fh, '<', 'list.txt' or die;
    map { 
        state $n = 0;
        $n++;
        chomp;
        open my $fh, '>', "file_$n.txt" or die;
        ( $_, $fh )
        } <$list_fh>;
    };

2番目の部分では、作成したファイルハンドルのハッシュを使用して、 details.txtを確認します。

open my $details_fh, '<', 'details.txt' or die;

DETAIL: while( <$details_fh> ) {
    chomp;
    my( $car ) = m/\A(.*?)_/;
    my $fh = $out_fhs{ $car } || do {
        warn "Car [$car] is not in list.txt. Skipping.\n";
        next DETAIL;
        }

    say $fh $_;
    }
于 2012-08-14T10:29:27.890 に答える
0
#!/usr/bin/env perl

use strict;
use warnings;

my %cars;
open my $fh, '<', 'F1.txt' or die $!;
while (<$fh>) {
    chomp;
    $cars{lc $_} = undef;
}
close $fh;

open $fh, '<', 'F2.txt' or die $!;
my $num = 1;
while (<$fh>) {
    if (/\s*([a-z]+)_\d+/i) {
        my $k = lc $1;
        if (exists $cars{$k}) {
            if (!defined $cars{$k}) {
                open my $fd, '>', "file_$num.txt" or die $!;
                $cars{$k} = $fd;
                $num++;
            }
            print {$cars{$k}} $_;
        }
    }
}
close $fh;
于 2012-08-13T04:11:21.697 に答える
0

file_audi.txtなどを生成する別のオプションは次のとおりです。

use Modern::Perl;

{
    open my $DETAILSIn, '<', 'DETAILS.txt' or die $!;
    my @details = <$DETAILSIn>;

    open my $LISTIn, '<', 'LIST.txt' or die $!;
    while ( my $car = <$LISTIn> ) {
        chomp $car;
        my @recs = grep /^$car\_/i, @details or next;
        open my $fh, '>', "file_$car.txt" or die $!;
        print $fh @recs;
    }
}

開いているすべてのファイルは、ハンドルがスコープから外れると自動的に閉じます。

お役に立てれば!

于 2012-08-13T05:55:43.317 に答える