我是perl的新手。继承人我的问题:
my $monopentime;my $monopenper;my $monclosetime;my $moncloseper;my $monclosed;
if($monday ne "closed"){
my @monfields = split /-/, $monday;
my $monopen = $monfields[0];
my @monopenparts = split / /,$monopen;
my $monopentime = $monopenparts[0];
my $monopenper = $monopenparts[1];
my $monclose = $monfields[1];
my @moncloseparts = split / /,$monclose;
my $monclosetime = $moncloseparts[0];
my $moncloseper = $moncloseparts[1];
my $monclosed=0;
print $monopentime;
} else {
my $monopentime="1";
my $monopenper="AM";
my $monclosetime="1";
my $moncloseper="AM";
my $monclosed=1;
}
print $monopentime;
如果您发现我有两个打印语句,一个在ne clause
内,另一个在if else
之外。当我打印变量inside
时,它会打印数据,但是当我在if else
子句之外打印时,我什么也得不到。
就像我说的那样,对于Perl来说,这是一个相当新的问题? 我也将变量设置在条款之外
答案 0 :(得分:3)
my
在词法上将 new 变量范围限定为当前块。
如果您在启用strict
和warnings
的情况下运行此操作,则会获得:
"my" variable $monopentime masks earlier declaration in same scope.
这正是它所说的 - 你将它声明两次,将一个值写入块中的 - 然后它在块的末尾消失。
所以基本上 - 删除你在开头已经声明的变量的'my'语句,它会起作用。
然后启用use strict;
use warnings;
,因为这会告诉您具体问题是什么。
答案 1 :(得分:3)
my
创建一个新变量(作用于其所在的最内部块)。在if
内,您要分配给现有变量,因此请删除my
。
my ( $monclosed, $monopentime, $monopenper, $monclosetime, $moncloseper );
if ($monday eq "closed") {
$monclosed = 1;
$monopentime = "1";
$monopenper = "AM";
$monclosetime = "1";
$moncloseper = "AM";
} else {
$monclosed = 0;
my ($monopen, $monclose) = split /-/, $monday;
( $monopentime, $monopenper ) = split ' ', $monopen;
( $monclosetime, $moncloseper ) = split ' ', $monclose;
}
print "$monopentime\n";
我同时清理了代码。
my
的列表形式来提高可读性。split ' '
代替split / /
来提高稳健性。 (这些不等同。)$monclosed
移至前/后。这似乎更自然。答案 2 :(得分:1)
使用my
声明的变量是词法范围的,这意味着它们只存在于最里面的封闭块中。在这种情况下,这意味着你的if和else块。如果您需要在这些块之外访问它们的值,则应在if语句之外声明它们。
use warnings;
和use strict;
也会显示您正在隐藏$monopentime
的定义。