perl不保存if子句之外的变量值

时间:2016-07-18 16:20:21

标签: perl

我是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来说,这是一个相当新的问题? 我也将变量设置在条款之外

3 个答案:

答案 0 :(得分:3)

my在词法上将 new 变量范围限定为当前块。

如果您在启用strictwarnings的情况下运行此操作,则会获得:

"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的列表形式来提高可读性。
  • 在条件中避免不必要的否定(通过交换“then”和“else”块)。
  • 使用split ' '代替split / /来提高稳健性。 (这些不等同。)
  • 改进缩进和间距。
  • $monclosed移至前/后。这似乎更自然。

答案 2 :(得分:1)

使用my声明的变量是词法范围的,这意味着它们只存在于最里面的封闭块中。在这种情况下,这意味着你的if和else块。如果您需要在这些块之外访问它们的值,则应在if语句之外声明它们。

use warnings;use strict;也会显示您正在隐藏$monopentime的定义。