【发布时间】:2009-07-29 08:03:03
【问题描述】:
我正在尝试从两个文件中读取,并在第三个文件中生成输出。我首先想在旅途中编辑第一个,但我没有找到合适的方法来保存数组。
我的问题是,每当我取消注释“_ref_param_handling”函数时,第三个文件(输出)都是空的。 但是以下是最让我困惑的:如果我在最后的输出文件上执行一个非常基本的 UNIX `cat` 系统调用(见下面的代码),它工作得很好。如果我在之前打开文件句柄并在编辑后立即关闭它,它也可以正常工作(围绕我的 print FILEHANDLE LIST)。
我无疑在这里遗漏了一些东西。除了我的键盘和椅子之间的问题之外,还有什么问题?文件句柄冲突?范围问题?
每个变量都被声明并具有我希望它具有的值。
编辑(不再适用)。 在三个文件上使用 IO::File 并没有改变任何东西。
编辑2:新的完整子程序代码
我的代码可以工作(除非我的 ref 已经存在,但那是因为我认为是“附加”模式),但可能存在一些错误和 unperlish 编码方式(抱歉,Monks)。但是,我使用严格和警告!
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
任何帮助表示赞赏。
【问题讨论】:
-
始终使用“
use strict;”和“use warnings'”启动您的 Perl 程序。 -
我愿意!这只是子程序的一部分。
-
我认为我明白你的意思。仍然不知道您是否想要替换所有这些 {{}},想。无论如何,您说这已经有效,除了“>>”?你得到什么错误?
-
嗨莱昂纳多,感谢您的回复。我不想替换我的任何
{{' or}}',它们是我的 m4 注释分隔符。当使用“>>”访问现有的 ref_file 时,我实际上得到了一个无限的写入循环,但不要在这上面浪费时间。我正在调用 $EDITOR(或 vi)而不是逐行提示(仅在指定现有 ref_file 时)。这样,用户可以修改任何他需要的内容。
标签: perl filehandle