ファイルBのラベルをファイルAの値に置き換える

ファイルBのラベルをファイルAの値に置き換える

Perlの助けを探しています。ほとんどのコードを書いていますが、特に難しい部分が1つあります。

ファイルAの場合:

tag1=value1
tag2=value2

ファイルB:

value1=<tag1>
value2=<tag2>

擬似コード:

open file 1
open file 2
 read line of data from file 1 while data exists
   change the equal sign to a space ( tag1=value1 becomes tag1 value1)
   separate the line into two variables

[ここで魔法が起こるFileBの値をFileAの実際の値に変更します(以下の例を参照)。

close file 2
close file 1

だから私はいくつか試してみて、私の叔父さん(そしてここ)で問題を調査しました。単一のコマンドラインを使用してこれを行う簡単な方法があることを知っています(

prompt> gawk '{sub(/=/," ")}1' [path]/[FileA] | 
    gawk '{system ("perl -pi -e \x27s/"$1"/"$2"/g\x27 [path]/[FileB]")}' 

)、しかし私はそうしたくないので、代わりに私のPerlプログラムでそれを実装しようとします。なぜなら仕事をもっと難しくするのが好きだからです。 :-p。

たとえば、FileAに次のものが含まれている場合

<tag1>=192.192.2.3
<tag2>=5400

FileB には以下が含まれます。

connect IP=<tag1>
connect port=<tag2>

このプログラムが終わったら、FileBに次のものを含めたいと思います。

connect IP=192.192.2.3
connect port=5400

プログラムで交換を実行する方法を理解していますが、ファイルの更新に問題があります。

どんなアドバイスでも大歓迎です。完璧な解決策を必要とせず、正しい方向を知ることができる情報だけが必要です。

これはいいえ宿題。

答え1

最初のファイルのデータに基づいてハッシュテーブルを作成し、それを使用して2番目のファイルを変更したいようです。おおよそ言うと、これはあなたにいくつかのアイデアを与えることができます。

my %my_tags;

while (<$fh1>) {
    chomp;
    my ($tag, $value) = split /=/;
    $my_tags{$tag} = $value;
}

while (<$fh2>) {
    s/(\w+)=(\S+)/$1=$my_tags{$2}/;
    print;
}

代替魔法が必要な場合は、/e評価フラグの使用方法を確認してください。

答え2

この場合は、次のようにします。

read the tag-file (A) into a hash %tag
read the text-file into an array @text
for keys tag-hash 
    substitute all tags in the array

write the array @text to the textfile

または:

#!/usr/bin/perl
use strict;

my @text;
my %tags;
open (my $TAGS,'<',"fileA") or die "horribly";
while(<$TAGS>){
    if (/<(.*)>=(.*)/){
        $tags{$1}=$2;
    }
}
close $TAGS;
open (my $TXT,'<',"fileB") or die "no B";
@text=<$TXT>;
close $TXT;

for my $key (keys %hash) {
    for (@text){
        s/<$key>/$tags{$key}/;
    }
}

open (my $TXT,'>',"fileB") or die "cannot write a bee";
for (@text){
    print $TXT $_;
}

このコードはテストなしで書かれています。少なくとも新しい行を見てください。これは汚れている可能性があります。しかし、あなたは「完璧な解決策でさえ必要ではありません。正しい方向を知らせるだけです」と言われました。

答え3

Perlコマンドラインオプションを使用する1つの方法は、準awk方式で実行するようにすることです。以下で読むことができますperldoc perlrun

perl -F= -lane '
  @ARGV and %h=(%h,@F),next;
  print s|=\K.*|$h{$&}//$&|re; 
' fileA fileB

connect IP=192.192.2.3
connect port=5400

答え4

みんなありがとうございます!私は(同僚の助けを借りて)私が考えた代替案を学ぶことができるようにあなたの例を試してみましょう。

System("sed -is/'${var_one}'/'${var_two}'/g $outfile1");

わかりやすくするために、$ var_oneと$ var_twoは、「行を2つの変数に分割する」ステップから得られました。

もう一度ありがとうございます。

平和、クラーク「ザ・ドラゴン」ウィリス

関連情報