1

ここに私が持っているものがあります:

open INFILE,    "<",    "$inputfile";
open OUTFILE,   ">",    "$outfile";
@array = qw{ Element1 Element2 };
        if ( ! open INFILE, "<", "$inputfile") {
                die "Cannot open INFILE: $!";
        }
while (<INFILE>) {
         if ($_ =~ m/(str1)|(str2)/sg) {
              chomp;
              $regex = $_;
                   foreach $list (@array) {
                            print OUTFILE "\$list is $list\n";
                            print OUTFILE "String is $regex\n";
                    }
          }
}

close INFILE;
close OUTFILE;

私が得ているものは次のとおりです。

\$list is ELEMENT 1
String is str1
\$list is ELEMENT 2
String is str1
\$list is ELEMENT 3
String is str1

私はこの出力が欲しい:

\$list is ELEMENT 1
String is str1
\$list is ELEMENT 2
String is str2
\$list is ELEMENT 3
String is str3
4

1 に答える 1

0

すべてのスクリプトの先頭で使用する必要があるものを次に示します。

use warnings; use 5.012; # (or whatever version you are using)

useよりも大きいバージョンの場合、自動化や機能など、5.010あらゆる種類の機能を利用できます。strictsay

一人で行くのは危険です。エラー処理を持ち歩こう:

open my $filehandle, "<", $filename or die "Can't open $filename: $!";

openせずに使用dieすると、バグが発生する可能性があります。

while-loop を次のようにコーディングします。

while (my $line = <$infile>) {
  chomp $line;
  if ($line =~ /str[12]/) {
    foreach my $element (@array) {
      say $outfile "I am at element $element";
      say $outfile "The string is $line";
    }
  }
}

この ↑ は少し美化され、合理化されていますが、投稿に書いたものと同等です。ファイルが小さい場合は、

foreach my $line (grep {chomp; /str[12]/} <$infile>) {
  foreach my $element (@array) {...}
}

かなりきれいなコードができたので、問題について考えることができます。

@arrayあなたが与えたコードは、あなたが主張する出力を生成しませELEMENT 3str3。また、一致した文字列ごとに、 のすべての要素の内容を出力し@arrayます。print "\$"印刷物$ではありません\$

1 桁の後に一致させたいと仮定し、対応する位置にあるstrからその要素を選択したいとします。@array

# selecting the lines
my @lines;
while (<$infile>) {
  chomp;
  push @lines, [$_ => $1-1] if /str(\d)/ and $1 > 0; # avoid off-by-one errors
  # push @lines, [$1 => $2-1] if /(str(\d))/ and $2 > 0;
}

# clever initialization
my @array = map {"ELEMENT $_"} 1..9;

# print out the report
foreach my $line (@lines) {
  my ($string, $index) = @$line;
  my $element = $array[$index];
  say $outfile "I have $element";
  say $outfile "String is $string";
}
# folding the loops into one is left as an exercise for the reader

入力が

str1
str2
foo
str3
Here is str8 among other things!
bar
str45
baz

出力は次のようになります。

I have ELEMENT 1
String is str1
I have ELEMENT 2
String is str2
I have ELEMENT 3
String is str3
I have ELEMENT 8
String is Here is str8 among other things!
I have ELEMENT 4
String is str45
于 2012-10-30T19:47:15.243 に答える