曲径通幽论坛

 找回密码
 立即注册
搜索
查看: 4073|回复: 0
打印 上一主题 下一主题

chop()/chomp() -- 去掉变量最后一个字符

[复制链接]

4917

主题

5879

帖子

3万

积分

GROAD

曲径通幽,安觅芳踪。

Rank: 6Rank: 6

积分
34382
跳转到指定楼层
楼主
发表于 2012-7-17 00:15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
chop() 和 chomp() 用来删除变量的最后一个字符,或者是数组中每个元素的最后一个字符,并返回修改后的值。

chop() 一般用来删除程序接收到的输入行末尾的换行符,这些输入行可以来自 STDIN,文件或者命令置换结果。

chomp() 是 Perl5 中引入的函数,它和 chop() 的作用一样,且能保证只有当该行末字符是换行符时才进行删除操作,并返回删除后的字符数目。

使用 chomp() 来代替 chop() ,能有效避免删除除了换行符之外的其它字符。

下面是一个测试文本内容:
$ cat test.txt
hello world
hello perl
hello linux
先用下面的 perl 代码处理上面的文本:
[code=perl]#!/usr/bin/perl


while (<STDIN>) {
        $name = $_;
        print $name;
}[/mw_shl_code]
运行输出:
$ ./chop.pl < test.txt
hello world
hello perl
hello linux
上面的代码只是简单的读入来自文件 test.txt 的内容并输出。下面在上面的代码中添加 chop() 或 chomp() 函数:
[code=perl]#!/usr/bin/perl


while (<STDIN>) {
        $name = $_;
        chop($name);
        print $name;
}[/mw_shl_code]
运行输出:
$ ./chop.pl < test.txt
hello worldhello perlhello linux
由输出可见,被去掉换行符的每一行内容都排列在同一行上。

上面还需要注意一点的是,代码中的 $_ 变量不能写成 <STDIN> ,否则将只输出 hello perl 这一行内容。这是因为,while 里读入的每行内容实际上是存在 $_ 变量中的。如果将 $_ 代码改为 <STDIN>,那么 while 里先从标准输入第一行,接着 $name = <STDIN> 读入的就是第 2 行内容,即 hello perl,当这个动作完成后,test.txt 马上将第 3 条内容(hello linux)从 STDIN 送出,此时标准输入里已经没有内容,因此再循环到 while 时已经不会再读到内容,这就是只能看到输出 hello perl 的原因。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|曲径通幽 ( 琼ICP备11001422号-1|公安备案:46900502000207 )

GMT+8, 2024-5-5 21:08 , Processed in 0.078915 second(s), 22 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表