0

必要な出力を取得できません。
エラーを修正するのを手伝ってください。

ファイル1

A  
B  
C 
D  
E
F 

ファイル2

A  
D  
C  

望ましい出力 (見つかった場合は、より大きなファイルの相対位置に「1」を出力し、そうでない場合は「0」を出力します)

1
0
1
1
0
0

コード

#!/usr/bin/perl -w
open(FH,$file);
@q=<FH>;
open(FH1,$file2);
@d=<FH1>;
open(OUT,">out.txt");

foreach $i(@q) {
    foreach $j(@d) {
        if ($i eq $j) {
            $id=1 ;
            goto LABEL;
        } elsif ($i ne $j) {
            $id=1;
            goto LABEL;
        }
    }
}
print OUT "1\t";
LABEL:
print OUT "0\t";
}

close FH;
close FH1;
close OUT;

注: 実際のファイルははるかに大きく、奇数の要素が含まれています

4

4 に答える 4

2

次のアプローチを検討してください。

use strict;
use warnings;
use autodie;
use feature 'say';

open my $fh1, '<', 'file1';
open my $fh2, '<', 'file2';

say <$fh1> eq <$fh2> ? '1' : '0'
  until eof $fh1 or eof $fh2;

ノート:

  • use strict; use warnings;正気を保つために
  • autodie失敗したファイルを処理openする
  • レキシカルファイルハンドルは、ベアワードファイルハンドルよりも優先されます
  • sayシンタックス シュガーが 1 または 0 ごとに改行を自動的に追加するため
  • 各ファイルハンドルを 1 行ずつ読み込むダイアモンド演算子
  • eq2行を文字列比較する
  • COND ? TRUE : FALSE1 を出力するか 0 を出力するかを決定する三項演算子 ( )
  • until否定ですwhile
  • eof2 つのファイルハンドルのいずれかが使い果たされたときにループに通知する
于 2013-08-26T08:33:17.547 に答える
2

あなたが探していた

for $q (@q) {
    my $found = 0;
    for $d (@d) {
        if ($q eq $d) {
            $found = 1;
            goto LABEL;
        }
    }

    LABEL: print "$found\n";
}

上記は、次のように書くとより適切です。

for $q (@q) {
    my $found = 0;
    for $d (@d) {
        if ($q eq $d) {
            $found = 1;
            last;
        }
    }

    print "$found\n";
}

しかし、これらのソリューションはうまく機能しません。@dハッシュを使用すると、反復処理を回避できます。

my %d = map { $_ => 1 } @d;
for $q (@q) {
    print $d{$q} ? "1" : "0", "\n";
}
于 2013-08-26T14:06:05.903 に答える