4

次のようなエントリを含むテキストファイル temp.txt があります。

cinterim=3534
cstart=517
cstop=622
ointerim=47
ostart=19
ostop=20

注: キーと値のペアは、新しい行に配置することも、スペースで区切って 1 行にまとめて配置することもできます。

Perl を使用して、対応するキーのこれらの値を印刷して DB に保存しようとしています。しかし、多くのエラーと警告が表示されます。現在、これらの値を印刷しようとしています。

use strict;
use warnings;

open(FILE,"/root/temp.txt") or die "Unable to open file:$!\n";

while (my $line = <FILE>) {
  # optional whitespace, KEY, optional whitespace, required ':', 
  # optional whitespace, VALUE, required whitespace, required '.'
  $line =~ m/^\s*(\S+)\s*:\s*(.*)\s+\./;
  my @pairs = split(/\s+/,$line);
  my %hash = map { split(/=/, $_, 2) } @pairs;

  printf "%s,%s,%s\n", $hash{cinterim}, $hash{cstart}, $hash{cstop};

}
close(FILE);

誰かが私のプログラムを改良するのを手伝ってくれませんか?

4

3 に答える 3

11
use strict;
use warnings;

open my $fh, '<', '/root/temp.txt' or die "Unable to open file:$!\n";
my %hash = map { split /=|\s+/; } <$fh>;
close $fh;
print "$_ => $hash{$_}\n" for keys %hash;

このコードの機能:

<$fh>ファイルから 1 行、またはリスト コンテキストではすべての行を読み取り、それらを配列として返します。

内部mapでは、 regexp を使用して行を配列に分割します/= | \s+/x=これは、空白文字または一連の空白文字が表示されたときに分割することを意味します。これは、元のコードを凝縮して美化した形式にすぎません。

map次に、結果のリストを型にキャストしますhash。リストの項目数が偶数であるため、これを行うことができます。key key=value( orのように入力key=value=valueすると、この時点でエラーがスローされます)。

その後、ハッシュを出力します。Perl では、文字列内のハッシュ値を直接補間することができprintf、特別な書式設定を除いて and を使用する必要はありません。

ループはforすべてのキー ($_特殊変数で返される)を反復し$hash{$_}、対応する値です。これは次のように書くこともできます。

while (my ($key, $val) = each %hash) {
  print "$key => $val\n";
}

ここでeach、すべてのキーと値のペアを反復処理します。

于 2012-08-07T11:24:26.220 に答える
5

これを試して

use warnings;

my %data = ();

open FILE, '<', 'file1.txt' or die $!;
while(<FILE>)
{
    chomp;
    $data{$1} = $2 while /\s*(\S+)=(\S+)/g;
}
close FILE;

print $_, '-', $data{$_}, $/ for keys %data;
于 2012-08-07T11:22:21.910 に答える
4

最も簡単な方法は、ファイル全体をメモリに丸呑みし、正規表現を使用してキーと値のペアをハッシュに割り当てることです。

このプログラムはテクニックを示しています

use strict;
use warnings;

my %data = do {
  open my $fh, '<', '/root/temp.txt' or die $!;
  local $/;
  <$fh> =~ /(\w+)\s*=\s*(\w+)/g;
};

use Data::Dump;
dd \%data;

出力

{
  cinterim => 3534,
  cstart   => 517,
  cstop    => 622,
  ointerim => 47,
  ostart   => 19,
  ostop    => 20,
}
于 2012-08-07T12:36:10.823 に答える