免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: sunzhiguolu
打印 上一主题 下一主题

已经解决.结贴 脚本 Perl - 关于模块 Tie::File 的几点疑问 [复制链接]

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
1 [报告]
发表于 2015-12-03 21:07 |显示全部楼层
回复 2# sunzhiguolu


    我也认为对数组的 delete 没有什么意义。splice 只能提取连续的数组片段,更灵活的提取办法是:grep

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
2 [报告]
发表于 2015-12-03 23:06 |显示全部楼层
回复 19# sunzhiguolu


    我没有用过,只是最近才发现这个东西,想来想去,实在是没有用。

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
3 [报告]
发表于 2015-12-04 14:25 |显示全部楼层
学习 Perl 语言,很容易把注意力放在一些很少用到的特性上,因为 Perl 的各种古怪特性实在是太多了。Perl 语言有许多的糟粕,是没有必要深入了解的。例如 delete array 的行为。

Perl 语言的变量有标量和数组,还有哈希。所有的数值都能用标量形式表示,其实只要学会用标量表示数据就够了。
  1. my $str = 'aaa';
  2. my $array = [1,2,3];
  3. my $hash = { a => 1 };
复制代码
而下列用法完全可以不用:
  1. my @array = (1,2,3);
  2. my %hash = ( a => 1 );
复制代码
而 @array 的表示方法,只是把它当成一个可以容纳多个标量的容器:
  1. my ($name, $value) = @args;
复制代码
Perl5 不能对比数据结构,所以当你对比一个嵌套的数据结构时,最好使用 JSON 模块:
  1. use JSON qw(encode_json);

  2. my $data_one = [1,2,[3,4]];
  3. my $data_two = [1,2,[3,4]];

  4. if (encode_json($data_one) eq encode_json($data_two)) {
  5.     say "data is same";
  6. }
复制代码
如果这样写,就错了:
  1. if ($data_one eq $data_two) {
  2.     say "data is same";
  3. }
复制代码
要想使操作引用的行为和直接量相同,最好声明:
  1. use experimental qw(autoderef);
复制代码
这样下面的语句就能使用了:
  1. for my $key (keys $hash) {
  2.     say "key is $key";
  3. }

  4. for my $value (values $array) {
  5.    # ...
  6. }

  7. push $array, $key;
  8. shift $array;
  9. pop $array;
  10. delete $hash->{$key};
  11. exists $hash->{$key};
复制代码
引用最方便的地方就是没有数据复制成本,但如果不想修改原数据,需要对数据结构进行复制:
  1. my $copy_array = [ @{ $array } ];
复制代码
因为 splice, push, shift, unshift, pop, delete 等内置函数会直接在数据本身进行修改。

substr 与其说是内置函数,不如说是 Perl 的关键字, 因为下面的代码是错误的:
  1. my ($str, $pos, $len) = @args;
  2. my $sub_str = substr(@args); # error
  3. my $sub_str = substr($str, $pos, $len); # ok
复制代码
Perl 还有很多特性容易让人迷惑,如果想了解。就看看 Ruby, Python,看同样的算法,是怎么样实现的。

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 很给力!

查看全部评分

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
4 [报告]
发表于 2015-12-04 23:59 |显示全部楼层
本帖最后由 104359176 于 2015-12-05 00:02 编辑

回复 24# sunzhiguolu


    Tie:: 系列的模块没有用过,因为我知道将内存的数据通过 IO 和文件保持同步,会大大降低程序的速度。现在内存那么大,保存几个 G 的内容都没问题。
  
    处理完数据,一次性的保存到文件中就可以了。

    如果想使用操作 IO 的接口操作数据,就直接用字符串的引用。
  1. my $string = <<'MULTILINE';
  2. Buster
  3. Mimi
  4. Roscoe
  5. MULTILINE

  6. open my ($str_fh), '<', \$string;
  7. my @end_in_vowels = grep /[aeiou]$/, <$str_fh>;
复制代码
这个例子是<<Perl 高效编程>> 130 页的例子。

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 太棒了, 了解了好多知识!

查看全部评分

求职 : 软件工程师
论坛徽章:
3
程序设计版块每日发帖之星
日期:2015-10-07 06:20:00程序设计版块每日发帖之星
日期:2015-12-13 06:20:00程序设计版块每日发帖之星
日期:2016-05-05 06:20:00
5 [报告]
发表于 2015-12-05 00:15 |显示全部楼层
回复 30# sunzhiguolu


Python 是通过第三方模块提供对正则的支持:
  1. import re
复制代码
但在语法上又特别的给与了正则表达式特别的待遇 :
  1. if re.match(r'\n', any_str):
  2.     print("ok")
复制代码
正则表达式也可以通过字符串转换:
  1. def str_to_regex(s): return re.compile(s)
复制代码
然后就能用了:
  1. compile_regex = str_to_regex(regex_str)
  2. if compile_regex.match(any_str):
  3.     print("ok")

复制代码
Python 正则的写法可以使用和 Perl 几乎相同的形式。

评分

参与人数 1信誉积分 +10 收起 理由
sunzhiguolu + 10 赞一个!

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP