我需要帮助来理解我在执行这个相对基本的 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 行)
如果我使用第 17 行的印刷品,我将一无所获。
我一定没有 在变量 $service 中设置以填充散列,但没有散列是空的。
你能解释一下这种行为并给我一些建议吗?
预先感谢您能给我的所有帮助。
最好的问候,
塞德里克
你正在遭受缓冲。这不是没有打印价值的情况;这是价值尚未打印的情况yet.
print
默认打印到当前选择的句柄,默认为STDOUT。
连接终端时,默认情况下 STDOUT 是行缓冲的。这意味着它会在换行时或缓冲区变满时刷新。或者当句柄关闭时(例如当程序退出时)。
(当连接到终端以外的其他东西时,STDOUT 像其他句柄一样被块缓冲。这意味着当缓冲区变满时它会被刷新。)
您可以使用
禁用当前选定句柄的缓冲$| = 1;
您可以使用
禁用 STDOUT 的缓冲STDOUT->autoflush( 1 );