免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1405 | 回复: 4
打印 上一主题 下一主题

一段perl程序求解! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-12-17 11:34 |只看该作者 |倒序浏览
> Hi!
>
> I work in a library and i need to have several fields in one line
>
> Example
>
> I have this
>
> =995  \\$xPR$wLivre
> =995 \\$bECAM$cECAM
> =995  \\$n
> =995  \\$oDisponible
> =995  \\$kG1 42171
>
>
> and i want in one line
>
> =995 \\$bECAM$cECAM$kG1 42171$n$oDisponible$xPR$wLivre
>

Using Dr., Ruud's data. This is another way of doing it:
  1. use warnings;
  2. use strict;

  3. my %data_collection;

  4. while (<DATA>) {
  5.     chomp;
  6.     my ( $key, $value ) = split /\s+/, $_, 2;
  7.     push @{ $data_collection{$key} }, $value;
  8. }

  9. print $_, " ", @{ $data_collection{$_} }, $/ for keys %data_collection;

  10. __DATA__

  11. =995  \\$xPR$wLivre
  12. =995 \\$bECAM$cECAM
  13. =995  \\$n
  14. =995  \\$oDisponible
  15. =995  \\$kG1 42171
  16. zz 1
  17. zz  2
  18. zz   3
复制代码
求大神 解释下push 这行中的@{} ,还有顺便解释下$/!!!

ths !!!

论坛徽章:
0
2 [报告]
发表于 2012-12-17 12:16 |只看该作者
%data_collection是一个hash,每个key对应的value是一个array的引用

论坛徽章:
6
卯兔
日期:2013-11-26 14:52:02丑牛
日期:2014-02-19 18:01:25卯兔
日期:2014-05-20 20:34:06白羊座
日期:2014-05-23 13:39:232015亚冠之大阪钢巴
日期:2015-08-07 20:57:582015亚冠之大阪钢巴
日期:2015-09-02 14:09:09
3 [报告]
发表于 2012-12-17 14:27 |只看该作者
key1->value1{
                 \\$xPR$wLivre

                 \\$bECAM$cECAM

                 \\$n

                 \\$oDisponible

                 \\$kG1 42171
                     }
key2->value2{
                   1

                   2

                   3
                  }
“$/” 和 “$\”分别是输入输出记录分隔符。当你在读或者写数据时,他们主要控制用什么来定义一个“记录”。
当你第一次学习perl,第一次知道文件输入操作符的时候,也许你会被告知“<FILE>”就是从一个文件读
入一行数据,而读入的每一行都包括一个新行字符(“\n”)。其实你所知道的这些并不完全是真的,那只是一个很特殊的情况。实际上文件输入操作符(“<>”)读数据后会包含一个在“$/”中指定的文件输入分隔符。让我们来看一个例子:

假设你有一个文本文件,内容是些有趣的引文或者一些歌词或者一些别的什么东西。比如类似下面的内容:
代码


    This is the definition of my life
    %%
    We are far too young and clever
    %%
    Stab a sorry heart
    With your favorite finger



在这里有三段被一行“%%”分隔的引文。那么我们该如何从这个文件中一次读取一段引文呢。(译者注:这一段引文可是一行也可以是几行,比如例子中的第一段和第二段引文都是一行,而第三段引文是2行)
其中一个解决方法就是,一次从文件中读取一行,然后检查读入的行是否是“%%”。因此我们需要声明一个变量用来保存每次读入的数据,当遇到“%%”后重新组合先前读入的数据为一段完整的引文。哦,你还需要记得处理最后一段引文因为它最后没有“%%”。
这样的方法太过于复杂,一个简单的方法就是更改“$/”变量的内容。该变量的默认值是一个新行字符(“\n”),这也就是为什么“<>”
操作符在读取文件内容时是一次读一行。但是我们可以修改这一变量内容为我们喜欢的任意值。比如:

代码


    $/ = "%%\n";

    while (<QUOTE>) {
    chomp;
    print;
    }



现在我们每次调用“<>”,perl会从文件句柄中一次读取数据直到发现 “%%\n”为止。(不是一次读一行了)。
因此,当你用chomp函数来去掉读取数据的行分隔符时,就会删除“$/”变量中指定的分隔符了。在上例中经过chomp函数处理后的数据都会将
%%\n”删除。
回复 1# xiaofanbbk


   

论坛徽章:
0
4 [报告]
发表于 2012-12-17 15:34 |只看该作者
回复 3# 只是一个红薯


          非常感谢  没想到你解释的这么详细,彻底搞明白了$/的用法。

论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
5 [报告]
发表于 2012-12-18 14:06 |只看该作者
明白了$/的用法。非常感谢
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP