Perl 全局符号";%物业;需要显式的包名
当我使用strict时,我得到了下面的编译问题,否则它工作得很好。我试图为属性放置“我的”关键字,但这无法修复它。我做错什么了吗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 )
#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可能会更好,而不是这里的情况。