【问题标题】:Retrieve value from a form and write to a file从表单中检索值并写入文件
【发布时间】:2014-04-23 15:38:53
【问题描述】:

我有一个名为

的表格

index.cgi

还有一个名为

的配置文件

video.start

用户从下拉菜单中选择并按下提交后,该值将被读取并写入配置文件。这是我表单中的一个 sn-p:

<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>

这是来自index.cgi的代码:

my $file = "video.start";

open (my $in, "+<", $file);
open (my $out, "+<", $file);

my $a = CGI->new();
$video = $a->param('channel1');

while(<$in>)
{
    print $out $_;
    last if $.==3;
}

while(my $data = <$in>)   
{
    #logic

    print $out $data;
    last if $.==5;
}

最后,这是我的配置文件的样子:

#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会根据用户提交的值在配置文件中发生变化。但是我怎样才能在我的逻辑中实现这一点?

【问题讨论】:

  • 与其摆弄配置文件(可能会因为磁盘不足或其他原因而变得糟糕),只需创建四个静态配置文件并使用用户选择的那个。
  • 但是我仍然可以写入同一个文件,对吧? @tripleee
  • 你可以,但我说不要这样做。 (为什么你需要一个单独的文件呢?)
  • 当然,您的问题并不完全清楚,但我的解释是您希望您的 Perl 脚本修改 video.start 文件。相反,如果用户选择/dev/video0,则使用video.start0,如果用户选择/dev/video1,则使用video.start1,等等。在磁盘上编辑文件很脆弱;在磁盘上已有四个几乎相同的静态文件可供选择可以避免许多问题,尽管它并不完全优雅。如果您能告诉我们如何使用这些文件,我们或许可以告诉您如何完全避免使用这些文件。
  • 这里有几种方法可以做到这一点:perlmaven.com/how-to-replace-a-string-in-a-file-with-perl 我建议使用 CPAN 模块选项之一,因为它更容易使用。通过 CPAN 模块,我指的是带有双冒号的任何内容,例如“Path::Tiny”或“File::Slurp”示例。有关 CPAN 的更多信息并搜索可能也有很大帮助的模块,请继续搜索 CPAN 并搜索“文件句柄”:search.cpan.org/search?mode=all&query=filehandle

标签: html forms perl


【解决方案1】:

最大的诀窍是您需要在编辑文件之前flock 文件,以免出现竞争条件。

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";

之后,只需阅读How do I change, delete, or insert a line in a file, or append to the beginning of a file?。我个人会选择Tie::File,因为我认为这可能是在这种情况下编辑文件的最简单方法。

【讨论】:

  • 所以我必须安装那些插件? @米勒
  • 不,flockTie::File 都是核心。回想起来Tie::File 可能有点太复杂了,但是如果它变得太多,我给你的那个链接中还有很多其他方法推荐。
  • 但我只想在从表单中检索值后更改 /dev/video0。你给我的答案有可能这样做吗? @米勒
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-06-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多