将基本 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
我目前正在尝试将 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