这里没有软件测试的泛泛理论,只有博主的最佳实践。 博主的研究方向为静态分析和性能测试,致力于各种测试工具的引入、评估和开发。 本博的测试文章均为作者原创,转载请务必注明出处。

小骆驼书作业五:输入与输出

上一篇 / 下一篇  2008-07-07 13:52:43 / 个人分类:Perl

习题一:写一支功能跟cat相似的程序,但是将隔行反序输出(某些系统)会有名为tac的类似工具。

#!/usr/bin/perl -w
print reverse <>;

没了,就这么短。如果是写cat程序,就是 print <>; 如此紧凑的代码,却能实现如此强悍的功能,只能说“我们站在了巨人的肩上”

习题二:写一支程序,要求用户分行键入各个字符串,然后以20个字符宽、向右对齐的方式输出每个字符串。

本身没什么,主要是练习printf的使用。这里需要注意的是 @input = <STDIN> 如果用户输入的是hello,那么实际input获取的是 hello\n,多了一个换行符号。虽然这一点在前面几章我就已经知道了,但今天在完成这个作业时还是出了点小差错。不过也好,总算强化了一下。我的答案就不提了,我的答案比较“传统”,用了foreach处理。下面看看另一种答案。

#!/usr/bin/perl -w
$ruleline="1234567890" x 5;
chomp(@input = <STDIN>);
print $ruleline."\n";
my $format = "%20s\n" x @input;
#print $format;
printf $format,@input;

最后一行代码可以一些性输出全部的列表。上面的一行注释是调试用的,主要想看一下$format的内容。如果用户输入的是hello good-bye,那么@input用在标量上下文中就是2,那么$format就是%20s\n%20s\n。最后一行printf $format,@input 即 printf "%20s\n%20s\n",@input,哈哈,目标达到。

习题三就不详细提了,这里要注意一点,开始我的写法是

printf "%$parm"."s\n",$_;

看标准答案是printf "%${parm}s\n",$_;这里涉及到的是在双引号中标量替换的问题,如果$parm是30,那么实际代码就是 printf "%30s\n",$_; 

按照最原始的写法是printf "%$parms\n",但这样编译会出错,提示说没有$parms这个标量(我使用了perl -w),所以这么写不行,要么使用笨方法,像我开始那样做的,或是使用巧一点的做法,如标准答案使用{}。

据说(附录的参考答案说)也可以用这种写法 printf "%*s\n",$parm,$_;

复习笔记 

×<STDIN>标准输入流,STDIN是文件句柄的的整行输入操作符,用于在程序执行过程中让用户输入的数据;

×两种结构的不同
  while (<STDIN>) {print "I saw $_";}
  foreach(<STDIN>) {print "I saw $_" };

 二者完成的行为完全相同,不同之处在于其背后的运作方式。while循环中,perl每次都读取“一行”输入;在foreach循环中,它必须先将输入全部读进来。假如输入来自400MB的WEB服务器日志文件,如果使用foreach一次性全部读进来,需要1G的内存。所以最好的做法,通常是尽量使用while循环的简写,让它每次处理一行。

×钻石操作符<>,用于程序调用的(命令行)参数,借助于钻石操作符,你可以在运行时指定程序的输入来源。如./myfunc fred - betty 表示程序的参数是fred - betty,-通常表示标准输入流<STDIN>。

×<>输入的参数保存在Perl默认变量@ARGV数组中

×输出数组和替换数组是两回事,如@arrar = qw/fred barney betty/
 print @array;  #输出 fredbarneybetty
 print "@array"; #输出 fred barney betty 中间以空格隔开

  通常情况下,如果数组中的字符串包含换行符号,那么直接用 print @array;就好了
  如果它们不包含换行符号,要用 print "@array\n";即可。

×printf格式化输出,和C基本上类似,用的时候再过来查即可

×Perl保留了6个各具特殊用途的文件句柄名称:STDIN STDOUT STDERR DATA ARGV ARGVOUT

×open LOG ">>logfile"; 表示打开LOG文件句柄,该句柄表示“追加信息到logfile文件中”。

×本次作业内容不够全面,没有涉及到文件句柄的使用,以后用到的时候还要过来查。

 


TAG: Perl

 

评分:0

我来说两句

Open Toolbar