【问题标题】:Check Internet Connectivity & Output into txt file [PERL]检查 Internet 连接并输出到 txt 文件 [PERL]
【发布时间】:2017-11-03 09:51:30
【问题描述】:

我正在尝试获取一些代码,以便我检查“互联网连接”并将布尔值 (0, 1) 存储到文本文件中。我在代码更新更改互联网连接时遇到问题,它在初始执行时有效,但是当我更改互联网环境时,文本文件无法更新。我尝试使用无限 while 循环来允许与 sleep() 一起进行连续检查,以防止我的计算机自行炸毁。

非常感谢任何帮助。

use strict;

use Net::Ping;

my $filename = 'internetConnectivityStorage.txt';
open(my $fh, '>:encoding(UTF-8)', $filename);

while() {
    my $x = Net::Ping->new("icmp");
    if ($x->ping("8.8.8.8", 1)) {
        print $fh "1";
    } else {
        print $fh "0";
    }
    close($fh);
    sleep(3)
}

PS。我是新手,对 perl 很陌生。从谷歌搜索和猜测中幸存下来;)

【问题讨论】:

  • 我已经修复了您的代码示例中的缩进。不客气,但请考虑以后自己做。适当的缩进是理解代码的重要工具。如果您要求大量陌生人阅读和理解您的代码,那么不努力使其尽可能简单就有点粗鲁了。
  • 在谷歌搜索和猜测中幸存下来建议您获得a good book
  • @DaveCross 或使用最方便的信息访问方式,即互联网。
  • 好吧,你已经证明这对你来说不是特别好:-)
  • @DaveCross 考虑到我的问题在 12 小时内得到解决,认为它工作得很好。

标签: perl


【解决方案1】:
use strict;
use warnings;
use Net::Ping;
my $filename = 'internetConnectivityStorage.txt';

while() {
    open(my $fh, '>:encoding(UTF-8)', $filename);
    my $x = Net::Ping->new("icmp");
    print {$fh} ($x->ping("8.8.8.8", 1)) ? 1 : 0;
    close($fh);
    sleep(3)
}

一些变化。我将 open 移至 while 循环,我认为您想在 while 循环的每次迭代中更新文件的内容。

【讨论】:

  • 如果您在每次迭代中重新打开文件,我建议将文件 附加 到文件 (>>) 而不是覆盖 (>) 。打印后关闭文件时也不需要刷新。
  • 我的印象是 OP 只需要最后一个结果作为某种信号量文件。至于冲洗,你的权利和我已经编辑以反映这一点。
  • 啊,我必须承认我忽略了这一点。当然你是对的,最后一行就足够了。
【解决方案2】:

您打开文件一次,但在 while 循环中关闭文件句柄,因此它不会被更新。 将 close($fh); 移到 while 循环的右大括号后面。

另外,我相信输出在写入文件之前会被缓冲,所以你不会立即看到它。 在脚本开头添加$| = 1; 以关闭输出缓冲。

【讨论】:

  • 设置$| = 1$fh 没有影响。它作用于当前选择的输出文件句柄,最初是STDOUT,所以你必须写{ my $old = select $fh; $| = 1; select $old; }。更好的方法是使用autoflush 方法,如$fh->autoflush,它更具表现力并且不需要使用select。更好的是,如果 perl 在文件句柄上找到未定义的方法调用,那么它会加载 IO::File 并再次尝试,因此甚至不需要将 use IO::File 添加到您的代码中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-31
  • 1970-01-01
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2018-10-09
  • 2016-03-07
相关资源
最近更新 更多