加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

在perl cgi中使用(/)除法运算符时出错?

发布时间:2020-12-16 06:17:19 所属栏目:大数据 来源:网络整理
导读:我正在使用以下函数来计算天数. setAge函数的参数是epoc时间. sub getAge { my $diff; my $age=0; my $sec=86400; my $createTime; my $currTime; $createTime = $_[0]; $currTime = UnixDate("now","%s"); $diff = ($currTime - $createTime); $age =(($dif
我正在使用以下函数来计算天数. setAge函数的参数是epoc时间.

sub getAge {
    my $diff;
    my $age=0;
    my $sec=86400;
    my $createTime;
    my $currTime;
    $createTime = $_[0];
    $currTime = UnixDate("now","%s");
    $diff = ($currTime - $createTime);
    $age =(($diff-($diff%$sec))/$sec);
    return $age;
 }

但每当我使用除法运算符时,我得到以下错误

syntax error at /apollo/env/ShiftReport/server-root/gcShiftReport.cgi line 616,near ")
    {"
syntax error at /apollo/env/ShiftReport/server-root/gcShiftReport.cgi line 618,near "case 'OX-Gift-Hyderabad'"
Execution of /apollo/env/ShiftReport/server-root/gcShiftReport.cgi aborted due to compilation errors.

错误行来自紧随其后的函数定义.

sub getName {
    my $tempName = $_[0];
    switch ($tempName)
    {
            case 'Cart Software' { return 'CART' }
            case 'OX-Gift-Hyderabad' { return 'Gift' }
            else { return $_[0]}
    }
}

有人可以指出为什么会发生这种情况并且仅在我使用除法(/)运算符时.

解决方法

如评论中所述,您使用的是已弃用的 Switch模块.您可能忘记添加使用Switch,因此不会导入switch关键字.如果你想要这个功能,你应该使用使用功能qw(switch),它使用给定的关键字,when和default.

您的错误消息 – 相当模糊 – 来自perl而不处理switch($variable){…}作为有效语句.编译器认为它看到一个函数,因为裸字切换后跟parens,但是下面的块{…}会导致错误.

这与它之前的代码无关,如果我添加使用Switch,代码适用于我.

如果对此代码使用此特定功能是一个不错的选择,那么这是值得商榷的.

use feature qw(switch);

sub getName {
    my $tempName = $_[0];
    given ($tempName)
    {
            when ('Cart Software') { return 'CART' }
            when ('OX-Gift-Hyderabad') { return 'Gift' }
            default { return $_[0]}
    }
}

相当于,不依赖于开关:

sub getName {
    my $name = shift;
    return "CART" if $name eq "Cart Software";
    return "Gift" if $name eq "OX-Gift-Hyderabad";
    return $name;
}

我认为这是更可取的,因为更清楚哪种类型的比较.

ETA:您的子程序getAge可以更有效地编写.我冒昧地删除你的随机资本,因为它们是邪恶的,而perl确实区分了aFunctionForGettingStuff和aFunctionForgettingStuff.

我看到你正在使用某种自制方式截断浮子.这不是必需的,因为perl确实有一个内置函数来执行该操作:int()

sub getage {
    my $createtime = shift; # shift first argument off @_
    my $sec = 86400;
    # use int() instead of removing remainder
    my $age = int((UnixDate("now","%s") - $createtime) / $sec);
    return $age;
}

没有必要将语句堆叠成一个,但我认为删除尽可能多的转换变量是个好主意.但是,我认为有必要 – 从可读性的角度和良好的实践 – 在实际使用变量之前不要声明变量.这样,当你阅读代码并看到我的$foo = …你知道$foo被声明并分配到那里.

你甚至可以删除$age变量,但我觉得它确实增加了可读性以留下它.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读