Perl 全局符号";%物业;需要显式的包名

Perl 全局符号";%物业;需要显式的包名,perl,Perl,当我使用strict时,我得到了下面的编译问题,否则它工作得很好。我试图为属性放置“我的”关键字,但这无法修复它。我做错什么了吗 #Read properties file open( F, 'properties' ) or die "properties file is missing in current directory. Error: $!\n"; while (<F>) { next if (/^\#/); (my $name, my $val )

当我使用strict时,我得到了下面的编译问题,否则它工作得很好。我试图为属性放置“我的”关键字,但这无法修复它。我做错什么了吗

#Read properties file
open( F, 'properties' )
  or die "properties file is missing in current directory. Error:  $!\n";
while (<F>) {
    next if (/^\#/);
    (my $name, my $val ) = m/(\w+)\s*=(.+)/;
    my $properties{ trim($name) } = trim($val);
}
close(F);
my $current_host = $properties{host_server};
my $token        = $properties{server_token};
my $state        = 'success';
my $monitor_freq = $properties{monitor_frequency};

将声明移到循环之外

my %properties;
while(...) {
    ...
    $properties{ trim($name) } = trim($val)
}

将声明移到循环之外

my %properties;
while(...) {
    ...
    $properties{ trim($name) } = trim($val)
}

如果你不介意额外占用一点内存

my %properties = map {
  /^#/ ? () 
       : map trim($_), /(\w+)\s*=(.+)/;
}
<F>;
my%properties=map{
/^#/ ? () 
:贴图修剪($)/(\w+)\s*=(.+)/;
}
;

my%属性=
地图修剪(美元),
map/(\w+)\s*=(.+)/,
格雷普;

如果您不介意额外占用一点点内存

my %properties = map {
  /^#/ ? () 
       : map trim($_), /(\w+)\s*=(.+)/;
}
<F>;
my%properties=map{
/^#/ ? () 
:贴图修剪($)/(\w+)\s*=(.+)/;
}
;

my%属性=
地图修剪(美元),
map/(\w+)\s*=(.+)/,
格雷普;
像这样:

open my $fh, '<', 'properties' or die "Unable to open properties file: $!";

my %properties;
while (<$fh>) {
  next if /^#/;
  my ($name, $val) = map trim($_), split /=/, $_, 2;
  $properties{$name} = $val;
}
my ($current_host, $token, $monitor_freq) =
    @properties{qw/ host_server server_token monitor_frequency /};
my $state = 'success';
打开我的$fh,如下所示:

open my $fh, '<', 'properties' or die "Unable to open properties file: $!";

my %properties;
while (<$fh>) {
  next if /^#/;
  my ($name, $val) = map trim($_), split /=/, $_, 2;
  $properties{$name} = $val;
}
my ($current_host, $token, $monitor_freq) =
    @properties{qw/ host_server server_token monitor_frequency /};
my $state = 'success';

打开我的$fh,'如果我在sub client_monitor_state(){my$token=$properties{token};}下面有sub-like,它找不到正确的属性怎么办?如何修复此问题?如果
my%属性在它前面。除非您知道原型的作用(子名称后的空参数),否则不要使用原型。如果我在子客户机\u监视器\u state()下面有子类({my$token=$properties{token};}),它找不到正确的属性怎么办?如何修复此问题?如果
my%属性位于其前面。除非您知道原型的作用(子名称后的空paren),否则不要使用原型。在声明变量期间,您不能将其分配给哈希键。您必须始终执行
my%hash$散列{foo}=…
分两行,除非一次分配整个散列:
my%hash=(foo=>bar,baz=>baaz)。在声明变量期间,不能将哈希键赋值。您必须始终执行
my%hash$散列{foo}=…
分两行,除非一次分配整个散列:
my%hash=(foo=>bar,baz=>baaz)…但你真的想说
我的$properties=map trim($)、map/(\w+)\s*=(.+)/、grep!/^#/
@amon如果您的意思是
%properties
,那么是。多个映射/grep有什么缺点吗?对不起,我当然是指散列。是的,使用
map
grep
有缺点,因为所有这些列表操作都将整个中间数据存储在堆栈上,但我们的两种解决方案在这方面是等效的。我的评论只是想指出,
map{COND?EXPR:()}
更像是用
map{EXPR}grep{COND}
来表达的。此外,在“尾部位置”中嵌套的
map
可以被展平:
map{map B($)、a($)}
map B($)、map a($)
@amon相同,那么堆栈(或堆)的内存是否在多个映射之间重用?在处理大型列表时调用多个映射的速度/内存代价有多大?这都有点偏离主题:)使用更少的循环通常更便宜,但通常不会改变算法的复杂性。
map
的一个问题是,它对输入和输出都使用堆栈,这对于大型列表来说当然更糟糕:输出会逐渐从下到上替换输入(实际上是
d拼接到堆栈中),但如果map表达式返回多个值,则会导致剩余的输入值向上复制(
map
是最坏情况下的O(n²)时间)。这意味着如果嵌套的expr返回多个值,嵌套的map可能会更好–这里不是这样的情况…但是您确实试图说
my$properties=map trim($)、map/(\w+)\s*=(.+)/,grep!/^#/,
@amon如果您指的是
%properties
,那么是的。多个映射/grep有什么缺点吗?对不起,我当然指的是哈希。是的,使用
map
grep
都有缺点,因为所有这些列表操作都将整个中间数据存储在堆栈上,但我们的两种解决方案是等效的我的评论只是想指出,
map{COND?EXPR:()}
更形象地表示为
map{EXPR}grep{COND}
。此外,“尾部位置”中嵌套的
map
可以展平:
map{map B($\uu),a($\u}
map B($\uuuuu)、map a($)相同
@amon ok,那么堆栈(或堆?)的内存在多个映射之间重用?以及在处理大型列表时调用多个映射的速度/内存成本有多高?这都有点偏离主题:)使用更少的循环通常更便宜,但通常不会改变算法的复杂性。
map
的一个问题是,它对输入和输出都使用堆栈,这对于大型列表来说当然更糟糕:输出会逐渐从下到上替换输入(实际上是
d拼接到堆栈中),但如果map表达式返回多个值,则会导致剩余的输入值向上复制(
map
是最坏情况下的O(n²)时间)。这意味着如果嵌套的expr返回多个值,嵌套的map可能会更好,而不是这里的情况。