LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 4561|回复: 16

大家来做几个perl小练习

[复制链接]
发表于 2004-2-9 22:54:32 | 显示全部楼层 |阅读模式
给develMM添点人气~~ ;)
练习
1,编写一个从 1 数到 100 的循环,并且
打印所有偶数
打印所有奇数
打印所有以 1、2 或 7 结尾的数字

2,编写一个从 100 向后数到 1 的循环


3,编写一个程序,该程序读取标准输入并打印以"hello"(大写、小写或大小写混合均可)开始的所有行。提示:请查看"perldoc perlrun"帮助页面,尝试使用 Perl 的内置开关,而不要编写自己的循环。


4,编写一个逻辑条件,该条件将检查一个标量是否已定义、是否是非零、回文(向前读和向后读都一样)或者是数字 234.98。分别使用和不使用 Perl 解释器的"-w"标志和"use strict"编译器编译参数各测试一次。如果生成了警告信息,您是否理解这些警告信息?


5,以通常(不带后缀)的表示法编写以下代码,如果可以,则简化它们:

print if $debug;
$i++ unless $i > 10;
unless ($j && !$i) { $j += $i while <> };
next while <>;
来自: http://www-900.ibm.com/developer ... d/part3/index.shtml
 楼主| 发表于 2004-2-10 02:08:44 | 显示全部楼层
初学乍练~,先做了前三道,
[/home/javalee/myperl]cat ex1.pl

  1. #!perl -w
  2. @num=1..100;                #把1到100的数存到数组@num
  3. $n=0;
  4. while ($n<=$#num) {           #这里$#num等于 100
  5.         print "$num[$n] ";$n+=2; # $num[$n] 是@num里的某个元素,要注意,
  6.                               #不是@num[$n] 哦! :):)
  7. }
  8. print "\n";
  9. $n=1;
  10. while ($n<=$#num) {
  11.         print "$num[$n] ";$n+=2;
  12. }
  13. print "\n";
  14. foreach (@num) {
  15.         if (/1$|2$|7$/) {print "$_ "}
  16. }
  17. print "\n";
复制代码

[/home/javalee/myperl]cat ex2.pl

  1. #!perl -w
  2. @num=1..100;
  3. @rev_num=reverse@num;  #reverse()的作用是把数组元素反排列。
  4. foreach (@rev_num) {
  5.         print "$_\n";
  6. }
复制代码

[/home/javalee/myperl]cat ex3.pl

  1. #!perl -w
  2. while (<>) {      # <>指标准输入,默认是键盘。返回值是输入的内容。
  3.         print if (/^hello/i);       # i (ignore)忽略大小写
  4. }
复制代码

脚本菜了些,还望兄弟们指教~ :thank
 楼主| 发表于 2004-2-10 02:21:13 | 显示全部楼层
第4和第5不太明白~~ 哪位给详细解释解释~:thank
发表于 2004-2-10 09:56:48 | 显示全部楼层
...
第一个不是一个循环就能完成的么
 楼主| 发表于 2004-2-10 14:33:11 | 显示全部楼层
最初由 x11 发表
...
第一个不是一个循环就能完成的么

第一个有三个小问题呀~
发表于 2004-2-10 14:52:07 | 显示全部楼层
第一道题:
族长的方法独特哦。。也可以这样,我的符合条件了,它没有说不准循环三次

  1. #!/usr/bin/perl -w
  2. for($i=2;$i<101;$i++) {
  3. print "$i " if( $i % 2 == 0 );    # % 的意思是取模,就是求两个整除数的余数。
  4. }
  5. print "\n\n";
  6. for($i=0;$i<101;$i++) {
  7. print "$i " if( $i % 2 == 1 );
  8. }
  9. print "\n\n";
  10. for($i=1;$i<101;$i++) {
  11. print "$i " if( $i % 10 == 1 || $i % 10 == 2 || $i % 10 == 7 );
  12. }
  13. print "\n";
复制代码

第二道题不用说了吧,看的懂第一道就懂写第二道,第三道以给出答案了。第四道的意思是要求你能读懂"warn:*****"的错误提示的意思并把错误改正,等发现有的时候在说,现在整不出来。。:confused:

最后一道的意思是把代码转换成这样的格式,看答案:

  1. if ( $dubug ) {
  2. print "SOTMETING\n";
  3. }

  4. unless( $i>10) {
  5. $i++ ;
  6. }

  7. unless( $j && !$i) {
  8.     while (<>) {
  9.            $j += $i ;
  10.     }
  11. }


  12. while(<>) {
  13. next ;
  14. }
复制代码


还有更多更优化的答案吗?
 楼主| 发表于 2004-2-10 15:59:15 | 显示全部楼层
谢谢版主指点~~,看来还是先打好基础吧~~ :thank
发表于 2004-2-10 16:06:45 | 显示全部楼层
最初由 javalee 发表
谢谢版主指点~~,看来还是先打好基础吧~~ :thank


不敢不敢,你的算法会有很多SIR们不懂(包括我),请你解释一下。。
:rolleyes:
 楼主| 发表于 2004-2-10 16:12:40 | 显示全部楼层
我是用数组的方法,
@num=1..100 #产生1到100个元素给数组num,其中 .. 是区间操作符号,
$#num返回数组元素的个数
foreach就不用说了,是个循环,是对@num这个数组进行历遍,然后用perl的默认变量$_来代表每个元素
开始我也想用求模的方法来显示奇/偶数,但是一时想不起来咋弄! 谢谢你的帮助~
btw:现在正在苦读数组和散列,循环,下李白该苦读正则了~,正如LY00兄说的,我的脚本有太深的shell影子 :p
发表于 2004-2-10 20:50:42 | 显示全部楼层
我的第一题:

  1. #! /usr/bin/perl -w

  2. for($i = 1; $i <= 100; $i++){
  3.   if($i % 2){
  4.     push(@odd, $i);
  5.   }else{
  6.     push(@even, $i);
  7.   }
  8.   if($i =~ /[1,2,7]$/){
  9.     push(@end, $i);
  10.   }
  11. }

  12. print join(", ", @even), "\n\n";
  13. print join(", ", @odd), "\n\n";
  14. print join(", ", @end), "\n";
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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