找回密码
 注册
查看: 2804|回复: 0

perl从<>输入内容

[复制链接]
发表于 2011-11-13 22:55:19 | 显示全部楼层 |阅读模式
另一种方法是使用尖括号◆输入(diamond operator):<>。这种方法对于书写类似于标准Unix◆工具的程序非常有用。如果
想写一个Perl 程序,使它具有像cat, sed, awk, sort, grep, lpr, 以及许多别的应用程序类似的功能,则<>将帮上你的大忙。对
于其它方面,<>可能帮不上你什么。
◆这种操作由Larry 的女儿,Heidi 命名。有一次Randal 到Larry 的家去, 给他看一些他一些新写的培训材料,抱怨到不知道怎么称呼它
(<>)。Larry 也不知道怎么叫它。Heidi(当时只有8 岁)突然说, “That’s diamond, Daddy”。因此就这样称呼它了。谢谢,Heidi。
◆不仅仅在Unix 系统中。许多别的系统也采用了这种invocation arguments(调用参数)的方法。
一个程序的调用参数(invocation arguments),通常是命令行中程序名字后面的一些“字符串”◆。下例中,它们是要被顺
序处理的文件的名字:
◆当程序开始运行运行时,它有0 个或多个调用参数,这由此程序决定。这通常出现在shell 中,此列表由你命令行中输入的内容决定。在
后面将看到,调用程序可以使用许多字符串作为调用参数(invocation arguments)。由于它们经常出现在命令行中,因此有时亦被称作命
令行参数(command-line arguments)。
$ ./my_program fred barney betty
上述命令的含义是,运行my_program(在当前目录下),它将处理文件fred,再处理文件barney,最后是文件betty。
如果没有命令行参数,程序将处理标准输入流(standard input stream)。作为一个特例,如果将连接号(-)作为一个参数,其
含义也是标准输入◆。如果调用参数为fred –betty,其含义是程序将首先处理文件fred,其次是标准输入流,最后是文件betty。
◆这是Unix 中很少人知道的一个事实:如许多标准的工具,如cat, sed, 也使用这种约定,连接号(-)代表标准输入流。
使用这种方法来书写程序的一个好处是,可以在程序运行时决定其输入。例如,你不需要重写它就可以在管道(pipeline)
中使用(将在后面讨论)。Larry 将它引入Perl,是因为他希望可以容易的写你自己的程序,使它们具有标准Unix 工具的特
点,甚至是在Non-Unix 系统中。事实上,Larry 本人就做了大量的此类程序。由于不同工具提供商提供的工具不同,Larry
可以创建他自己的工具,这些工具可以在不同的机器上使用,并且其行为相同的。当然,这意味着要首先将Perl 移植到这
些机器上去。
尖括号操作(<>)是一种特殊的行输入操作。其输入可由用户选择◆:
◆可能是从键盘,或者不是
while (defined($line = <>)){
chomp($line);
print “It was &line that I saw!\n”;
}
运行此程序,调用参数为fred, barney, betty,则结果大概如下:“It was [a line from file fred] (文件中fred 的一行)that I saw!”,
“It was [another line from file fred](文件fred 中的另一行) that I saw!”,直到文件fred 的结尾。然后,将自动转到文件
barney,一行一行的输出,最后到文件betty。从一个文件到另一个文件之间没有空行,当使用<>时,就像输入的是一个大
文件一样◆。如果输入结束时,<>将返回undef(同时退出while 循环)。
◆当前的文件名字被保存在Perl 的特殊变量$ARGV 中。名字“-”代表某个文件,如果其为标准输入流输入。
由于这是一种特殊的行输入操作,我们也可以使用前面的相似的简写方法:
while(<>){
chomp;
print “It was $_ that I saw!\n”;
}
这种方法和前一例的功能一样,但输入的字符更少。你可能注意到了,chomp 使用了默认参数,没有变量时,chomp 将对
$_操作。这又减少了输入。
由于<>通常被用来处理所有的输入,因此在同一个序中重复使用是不正确的。如果在同一个程序中使用了2 次<>,特别是
在while 循环内第二次使用<>读入第一次<>的值,其结果通常不是你所希望的◆。根据我们的经验,当初学者在程序中使
用第二个<>,通常是想使用$_。记住,<>读入输入,但输入内容本身被存储在$_(默认的情形)。
◆如果在第二次使用<>之前重新初始化@ARGV,则能得到正确的结果。在下一节将介绍@ARGV。
如果<>不能打开文件从中读入,它将打印出一些有用的诊断信息,如:
Can’t openwilma: no such file or directory
<>将自动转到下一个文件,这和cat 这个标准工具是一致的。
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|生物统计家园 网站价格

GMT+8, 2024-11-23 17:35 , Processed in 0.028843 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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