Html 从窗体中检索值并写入文件

Html 从窗体中检索值并写入文件,html,forms,perl,Html,Forms,Perl,我有一张名为 index.cgi 和一个名为 视频。开始 用户从下拉菜单中选择并按submit后,该值将被读取并写入配置文件。以下是我表格中的一个片段: <tr><td> <form method="POST" action="index.cgi"> <table> <tr><th colspan="2">Video</th></tr> <tr><td align="right"&g

我有一张名为

index.cgi

和一个名为

视频。开始

用户从下拉菜单中选择并按submit后,该值将被读取并写入配置文件。以下是我表格中的一个片段:

<tr><td>
<form method="POST" action="index.cgi">
<table>
<tr><th colspan="2">Video</th></tr>
<tr><td align="right"><b>Video Source :</b></td><td align="left">
<select name="channel1" size="1">
<option value="/dev/video0">/dev/video0</option>
<option value="/dev/video1">/dev/video1</option>
<option value="/dev/video2">/dev/video2</option>
<option value="/dev/video3">/dev/video3</option>
</select>
</td></tr>
</table>
</td></tr>
<tr>
<td colspan="2">
<div id="button">
<input type="submit" value="Submit"><input type="reset" value="Clear">
</div>
</form>
</td>
</tr>
最后,我的配置文件如下所示:

#Only change at [udp://#] segment 
#This config file is for video

ffmpeg -f video4linux2 -i /dev/video0 -vcodec libx264 -preset ultrafast -tune zerolatency -s qvga -r 30 -qscale 5 -an -flags low_delay -bsf:v h264_mp4toannexb -maxrate 750k -bufsize 3000k -rtbufsize 300k -f h264 udp://# 

如果您可以从配置表单中看到,在用户提交值后,/dev/video0将根据用户提交的值在配置文件中更改。但是在我的逻辑中,我如何才能做到这一点呢?

最大的技巧是,在编辑文件之前,您需要先修改它们,这样就不会出现竞争条件

use strict;
use warnings;
use autodie;

use Fcntl qw(:flock);

open my $fh, '<+', 'foobar.txt';
flock($fh, LOCK_EX) or die "Cannot lock mailbox - $!\n";
使用严格;
使用警告;
使用自动模具;
使用Fcntl qw(:flock);

打开我的$fh,'而不是摆弄配置文件(可能会因为磁盘不足或其他原因而变糟),只需创建四个静态配置文件并使用用户选择的一个。但我仍然可以写入同一个文件,对吗@三倍你可以,但我是说不要这样做。(无论如何,你为什么需要一个单独的文件呢?)当然,你的问题并不完全清楚,但我的解释是,你希望你的Perl脚本修改
video.start
文件。相反,如果用户选择
/dev/video0
,则使用
video.start0
;如果用户选择
/dev/video1
等,则使用
video.start1
。编辑磁盘上的文件很脆弱;磁盘上已经有四个几乎相同的静态文件可供选择,这避免了许多问题,尽管这并不完全优雅。如果您能告诉我们这些文件是如何使用的,我们可能会告诉您如何避免使用这些文件。这里有一些方法可以做到这一点:考虑到CPAN模块更容易使用,我建议使用其中一个CPAN模块选项。通过CPAN模块,我指的是任何带有双冒号的东西,比如“Path::Tiny”或“File::Slurp”示例。关于CPAN的更多信息和搜索可能也有很大帮助的模块,请运行到CPAN,搜索“filehandle”:所以我必须安装这些插件@Millerno、
flock
Tie::File
都是核心。在retrospect中,
Tie::File
可能有点太复杂了,但是如果太多,我在给您的链接中推荐了很多其他方法。但是我只想在从表单中检索到值后更改/dev/video0。你给我的答案是可能的吗@米勒
use strict;
use warnings;
use autodie;

use Fcntl qw(:flock);

open my $fh, '<+', 'foobar.txt';
flock($fh, LOCK_EX) or die "Cannot lock mailbox - $!\n";