将基本 JS 转换为 Perl

Converting basic JS to Perl

我目前正在尝试将 PostgreSQL 函数从 JS 转换为 Perl,因为 PLV8 扩展在我的环境中不可用。

我原来的JS/PLV8代码是:

CREATE OR REPLACE FUNCTION plays_users_stats_trigger()
  RETURNS trigger AS $$

    if (TG_OP === 'UPDATE' && OLD.user_id !== NEW.user_id)
      throw new Error('Update of user_id not allowed');

    var userId, gross = 0, net = 0, num = 0;
    var bet, cashOut, bonus;

    // Add new values.
    if (NEW) {
      userId  = NEW.user_id;
      bet     = NEW.bet;
      bonus   = NEW.bonus || 0;
      cashOut = NEW.cash_out || 0;

      gross  += Math.max(cashOut - bet, 0) + bonus;
      net    += (cashOut - bet) + bonus;
      num    += 1;
    }

    // Subtract old values
    if (OLD) {
      userId  = OLD.user_id;
      bet     = OLD.bet;
      bonus   = OLD.bonus || 0;
      cashOut = OLD.cash_out || 0;

      gross  -= Math.max(cashOut - bet, 0) + bonus;
      net    -= (cashOut - bet) + bonus;
      num    -= 1;
    }

    var sql =
      'UPDATE users ' +
      '  SET gross_profit = gross_profit + , ' +
      '      net_profit   = net_profit   + , ' +
      '      games_played = games_played +  ' +
      '  WHERE id = ';
    var par = [gross,net,num,userId];
    plv8.execute(sql,par);
$$ LANGUAGE plv8;

但是作为 Perl 的新手,我正在努力获得正确的功能,我得到的当前代码是:

CREATE OR REPLACE FUNCTION plays_users_stats_trigger() RETURNS trigger AS $$
    if($_TD->{event} = 'UPDATE' && $_TD->{old}{i}->user_id != $_TD->{new}{i}->user_id) {
        die('Update of user_id not allowed: %, at %',$_TD,now());
    }

    my $userId = undef;
    my $gross = 0; 
    my $net = 0; 
    my $num = 0;
    my $bet = undef;
    my $cashOut = undef;
    my $bonus = undef;

    if($OLD) {
        $userId = $OLD->user_id;
        $bet = $OLD->bet;
        $bonus = $OLD->bonus || 0;
        $cashOut = $OLD->cash_out || 0;
        $gross -= max($cashOut - $bet, 0) + $bonus;
        $net -= ($cashOut - $bet) + $bonus;
        $num -= 1;
    } elsif($NEW) {
        $userId = $NEW->user_id;
        $bet = $NEW->bet;
        $bonus = $NEW->bonus || 0;
        $cashOut = $NEW->cash_out || 0;
        $gross += max($cashOut - $bet, 0) + $bonus;
        $net += ($cashOut - $bet) + $bonus;
        $num += 1;
    }

    $sql = 'UPDATE users SET gross_profit = gross_profit + , net_profit = net_profit + , games_played = games_played +  WHERE id = ';
    spi_exec_prepared($sql, [$gross, $net, $num, $userId]);

$$ LANGUAGE plperl;

我不熟悉 PostgreSQL,但看了你的代码示例,这里有一些评论:

  • $TG_OP = 'UPDATE' :Perl 中的字符串比较是使用 eq 运算符
  • 完成的
  • $OLD.user_id !== $NEW.user_id :不相等的数值比较应该使用 != operator
  • 来完成
  • null 应该是 undef.
  • $userId = OLD.user_id :似乎 $OLD 是一个对象(通过查看您的代码)?那么您可能应该使用类似 $OLD->user_id 的方式访问 user_id 属性。在 Javascript 中使用点 . 运算符的所有其他属性访问也是如此;这些可能应该是 Perl 中的 -> 运算符。
  • NOTICE 'Update of user_id not allowed: %, at %' :您可以使用 die 函数
  • 在 Perl 中抛出异常
  • IF ... ELSE :在 Perl 中这是 if ... else
  • Math.max($cashOut - $bet, 0) :在 Perl 中,您可以使用模块 List::Util
  • 中的 max