Perl: $ 的打印是空的,没有

问题描述 投票:0回答:1

我需要帮助来理解我在执行这个相对基本的 perl 脚本时遇到的一个问题,这个问题对您来说可能看起来很愚蠢。

我想从文件中提取信息以填充稍后将使用的哈希。

以下是用作输入的文件的摘录:

    edit "DNS"
        set category "Network Services"
        set tcp-portrange 53
        set udp-portrange 53
    next
    edit "HTTP"
        set category "Web Access"
        set tcp-portrange 80
    next
    edit "HTTPS"
        set category "Web Access"
        set tcp-portrange 443
    next
    edit "IMAP"
        set category "Email"
        set tcp-portrange 143
    next
    edit "IMAPS"
        set category "Email"
        set tcp-portrange 993
    next
    edit "LDAP"
        set category "Authentication"
        set tcp-portrange 389
    next

这里是用于从输入中提取数据的代码(可能不是最佳的,我不仅仅是初学者):

#!/usr/local/bin/perl
 
 use strict;
 use warnings;
  
 my $InFile = "/mnt/c/Users/claidin/OneDrive - Hitachi Vantara/Desktop/Perso/Firewalling/log-rules/import-svc_objet.conf";
 open (InFile,"$InFile") or die "Can't open file\n";
 my $Ligne;
 my %svcDB =(); 
 my $svcname;
 my $service;
 while ($Ligne=<InFile>)
{
if ($Ligne=~ /set\s(.*)\-portrange\s(.*)\n/)
    {
    $service = (uc($1)."_".$2);
    print $service;
    #   print "$service\n";
    }
}

我的问题涉及变量 $service(它将用作填充我之前提到的哈希值的键)。

$service 的值仅在我添加时显示 我添加 打印(第 18 行)

例子:enter image description here

如果我使用第 17 行的印刷品,我将一无所获。

我一定没有 在变量 $service 中设置以填充散列,但没有散列是空的。

你能解释一下这种行为并给我一些建议吗?

预先感谢您能给我的所有帮助。

最好的问候,

塞德里克

perl printing is-empty
1个回答
0
投票

你正在遭受缓冲。这不是没有打印价值的情况;这是价值尚未打印的情况yet.

print
默认打印到当前选择的句柄,默认为STDOUT。

连接终端时,默认情况下 STDOUT 是行缓冲的。这意味着它会在换行时或缓冲区变满时刷新。或者当句柄关闭时(例如当程序退出时)。

(当连接到终端以外的其他东西时,STDOUT 像其他句柄一样被块缓冲。这意味着当缓冲区变满时它会被刷新。)

您可以使用

禁用当前选定句柄的缓冲
$| = 1;

您可以使用

禁用 STDOUT 的缓冲
STDOUT->autoflush( 1 );
© www.soinside.com 2019 - 2024. All rights reserved.