文档章节

GWA2-Perl的面向对象方法中数组或哈希列表参数传递问题

Wadelau
 Wadelau
发布于 2017/10/01 23:30
字数 773
阅读 35
收藏 0

最近基于 GWA2-Perl 生造了一个机器学习中的线性回归的轮子,纯手工地模拟了一个预测模型的各个模块和步骤。

GWA2的Perl版本继承和实现了GWA2的设计规范和风格,在充分利用Perl的面向对象设计思想及实现时,有些颇为吊诡的地方,应该引起注意,其中方法的参数传值问题就容易引起误解,我们在此前一篇的Blog中曾经谈到按引用传参和按值传参:

GWA2-Perl Warning: Reference found where even-sized list expected, -R/32SJ 。

 

如下是一个具体使用GWA2的Perl版本进行软件编程时,使用Array 或者 Hash进行传值时的正确写法的实例,供后续编程者参考。

正确的做法示例如下。
(A) ctrl/myctrl.pl:
….
my $obj = mod::MyModule->new();
my @arr = (1..5); # array original
my $i = 2;
my $rtn = $obj->getNumberByIndex(\@arr, $i); # pass by reference
….

(B) mod/MyModule.pm:
….
sub getNumberByIndex {
    my $self = $_[0];
    my @arr = @{$_[1]}; # de reference, restore array
    my $i = $_[2];
    ….

}

另外值得注意的是,按应用传递参数,其本身的设计与OOP思想是不相兼容的,在GWA2架构设计中并未充分考虑到,某一变量经由方法传递参数时,其默认行为是参数为局部变量,是按传值进行,也即,所传入的参数在当前方法体内可能产生变化。此时,如果是当着局部的按值传递的,不会影响到方法体外部,而理论上也不应该影响到方法体外部;然而,如果是按引用传递参数,在方法体内修改了引用所指向的参数,则该参数就会发生变化,如果在方法体外的某处有同时引用行为,则系统就可能出现异常、非预期情况。

这一问题,有望在Perl的后续版本中得到解决。目前,在OOP的架构设计中,如果不按引用进行参数传递,而是按照数值进行传递,如上面的代码修改为如下:

my $rtn = $obj->getNumberByIndex(@arr, $i); # pass by value

则可能导致,在 mod/MyModule.pm 中收到参数是一个将 @arr 的元素和 $i 混装的 list 列表,从而导致无法确切区分出第一个参数是一个 @arr , 而第二个参数是一个 $i . 后续也可能出现异常、非预期的情况。其他对Perl的OOP封装的框架是否很好解决这个问题,有待继续探索。

 

gwa2-logo-201606.v2.png (300×300)

gwa2-roadmap-201611.jpg (1224×703)

-GWA2 是一套通用网络应用(软件程序)架构系统,基于 -GWA2 可以轻便构建各种网络应用程序, 包括复杂的在线购物商城、 旅游交易平台、社群或者社交网站和新闻资讯网站等, 也包括各种企事业单位网上门户,在线交互及服务作业系统等. 还可以包括为NativeApp做服务器端支持, 甚至是WebApp的全部。

 -R/x12SP 

© 著作权归作者所有

Wadelau
粉丝 2
博文 27
码字总数 39147
作品 0
东城
架构师
私信 提问
GWA2Perl研发:try-catch无法退出循环、方法传参引用传值及多数据库链接

在使用 GWA2Perl 开发时遇到一些破费周折才发现的 Bug或改进的功能,分析记录如下,备忘。 GWA2 是一套跨语言的网络应用软件开发框架,目前有PHP、Java和Perl版本可供下载选用,也即 GWA2PH...

wadelau
2018/11/10
9
0
两个半小时的 Perl 之旅

Perl语言是一门高级解释型动态语言,它的许多数据类型是运行时才确定的,并且经常和PHP和 Python相提并论。Perl从古老的Shell脚本语言中借鉴了许多语法特性,因为被过度使用的各种奇怪符号而...

沙枣
2013/03/14
13.6K
37
perl学习【转载+积累】

基本信息 Perl一般被称为“实用报表提取语言”(Practical Extraction and Report Language)。Perl 最初的设计者为拉里·沃尔(Larry Wall),他于1987年12月18日发表。Perl借取了C、sed、a...

carmen-ly
2016/08/11
27
0
-Java forEach中 Lambda Expr中的 final变量要求

本文是关于 -Java Lambda Expression在forEach方法的应用讨论。对比其他编程语言的foreach 操作(文末附带7种主要编程语言的Loop HashMap by forEach的程序片段),Java 8引入的运用 Lambda E...

wadelau
2018/07/19
883
0
PHP Perl 关联数组 哈希表 Hash Table

关联数组,又称为哈希表(hash table),是一种非常好用的数据结构。 在程序中,我们可能会遇到需要消重的问题,举一个最简单的模型: 有一份用户名列表,存储了 10000 个用户名,没有重复项...

月洛
2013/08/30
290
1

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
1K
14
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
38
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
20
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部