2 つのファイルから読み取り、3 番目のファイルで出力を生成しようとしています。外出先で最初のものを最初に編集したかったのですが、配列を保存する適切な方法が見つかりませんでした。
私の問題は、「_ref_param_handling」関数のコメントを外すたびに、3 番目のファイル (出力) が空になることです。しかし、次のことが私を最も困惑させます: 出力ファイルの最後で UNIX の非常に基本的な ` cat`システム コールを実行すると (以下のコードを参照)、問題なく動作します。直前にファイルハンドルを開き、編集直後に閉じると、正常に動作します ( print FILEHANDLE LISTの周り)。
ここで間違いなく何かが欠けています。キーボードと椅子の間の問題は別として、それは何ですか? ファイルハンドルの衝突?スコープの問題?
すべての変数が宣言され、必要な値が含まれています。
編集 (適用されなくなりました)。 3 つのファイルで IO::File を使用しても、何も変わりませんでした。
編集 2: 新しい完全なサブルーチン コード
私のコードは動作します (私の ref が既に存在する場合を除きますが、それは "追加" モードのためだと思います) が、いくつかの間違いやコーディングの方法が損なわれる可能性があります (申し訳ありません、修道士)。ただし、Strict と warnings を使用します。
sub _ref_edit($) {
my $manda_def = "$dir/manda_def.list";
my $newrefhandle;
my $ref = $_[0];
(my $refout = $ref) =~ s/empty//;
my $refhandle;
my $parname = '';
my $parvalue = '';
my @val;
_printMan;
my $flush = readline STDIN; # Wait for <enter>
# If one or both of the ref. and the default values are missing
if ( !( -e $manda_def && -e $ref ) ) {
die "Cannot find $ref and/or $manda_def";
}
# Open needed files (ref & default)
open( $refhandle, "<", $ref ) or die "Cannot open ref $ref : $!";
open( $newrefhandle, ">>", $refout )
or die "Cannot open new ref $refout : $!";
# Read each line
while ( my $refline = <$refhandle> ) {
# If line read not an editable macro
if ( $refline =~ /^define\({{(.+)}},\s+{{.*__VALUE__.*}}\)/ ){
$parname = $1; # $1 = parameter name captured in regexp
# Prompt user
$parvalue = _ref_param_handling( $parname, $manda_def );
# Substitution in ref
$refline =~ s/__VALUE__/$parvalue/;
# Param not specified and no default value
$parvalue eq '' ? $refline=~s/__COM__/#/ : $refline=~s/__COM__//;
}
print $newrefhandle $refline;
}
close $newrefhandle;
close $refhandle;
return $refout;
} # End ref edit
_ref_param_handle サブルーチンはまだ次のとおりです。
open( $mde, '<', $_[1] )
or die "Cannot open mandatory/default list $_[1] : $!";
# Read default/mandatory file list
while (<$mde>) {
( $name, $manda, $default, $match, $descript ) = split( /\s+/, $_, 5 );
next if ( $name !~ $ref_param ); # If param read differs from parname
(SOME IF/ELSE)
} # End while <MDE>
close $mde;
return $input;
}
manda_def ファイルからの抽出:
NAME Mandatory? Default Match Comm.
PORT y NULL ^\d+$ Database port
PROJECT y NULL \w{1,5} Project name
SERVER y NULL \w+ Server name
modemRouting n NULL .+
modlib y bin .+
modules y sms .+
ref_file から抽出:
define({{PORT}}, {{__VALUE__}})dnl
define({{PROJECT}}, {{__VALUE__}})dnl
define({{SERVER}}, {{__VALUE__}})dnl
define({{modemRouting}}, {{__COM__{{$0}} '__VALUE__'}})dnl
define({{modlib}}, {{__COM__{{$0}} '__VALUE__'}})dnl
define({{modules}}, {{__COM__{{$0}} '__VALUE__'}})dnl
どんな助けでも感謝します。