免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: 无风之谷
打印 上一主题 下一主题

ChinaUnix技术实践之三——Perl编程大赛 [复制链接]

论坛徽章:
0
81 [报告]
发表于 2011-03-16 16:23 |只看该作者
部分代码与其他朋友的雷同,甚至一样。没办法
看到题目晚。。。
呵呵

论坛徽章:
0
82 [报告]
发表于 2011-03-16 17:45 |只看该作者
我就掺和第三题吧
  1. #!/usr/bin/perl

  2. use strict;
  3. use warnings;


  4. my $string = '1,2,3,5,6,7,8,10,11,12,13,14';
  5. my ($range) = $string =~ m/(\d+)$/;
  6. my @numbers = (1..$range);
  7. my @keys = split /,/, $string;

  8. my %hash;
  9. @hash{@keys} = undef;
  10. my @missing_numbers = grep {!exists $hash{$_} } @numbers;

  11. foreach (@missing_numbers) {
  12.     $numbers[$_ - 1] = ',';
  13. }

  14. my $result = join " ", @numbers;
  15. $result =~ s/(\d+).+?(\d+)(?=\s,|$)/$1-$2/g;
  16. print $result;
复制代码

论坛徽章:
0
83 [报告]
发表于 2011-03-16 19:12 |只看该作者
回复 1# 无风之谷

1.
  1. sub myfunc{
  2.    
  3.    $x? return 1 :return ;

  4. }
复制代码
2.$x=()的结果是空。1.给一个标量变量,一个数组或散列的标量元素赋值,在右手边就会以标
   量环境计算
                    2.如果给一个数组或者散列,或者它们的片段赋值,在右手边就会以列表
                    环境进行计算,即便是该片段只选出了的一个元素
                    ()不是用来创建空的list,因为空的()是处在标量环境。

3.使用范围操作符"..",1-3为1 .. 3, 5-8为 5 .. 8


4.$x[1]表示数组@x的第2个元素7,@x[1]表示二维数组@x的第0行的第二部分。

5.
  1. #/usr/bin/perl -w
  2.        #使用qx带有命令的返回值
  3.         @sortdir=qx/ls -lt/;
  4.        print @sortdir;
复制代码
6.
  1. #/bin/usr/perl -w
  2. #author ly@avg.pl  20110314
  3. print ">please input a series number,divide with ',':";
  4. #传入一串数字
  5. $numbers=<STDIN>;
  6. chop $numbers;
  7. @singels=split(/,/,$numbers);

  8. #取得数字个数
  9. $count=@singels;

  10. #取平均值
  11. $sum=0;
  12. foreach $singel(@singels){
  13.                
  14.                   $sum+=$singel;

  15. }

  16. #打印正确答案
  17. print "$sum '/' $count = $avg\n";
  18. foreach $singel(@singels){
  19.                 if($singel>$avg){
  20.                         print "$singel\n";
  21.         }
  22. }
复制代码
7.
  1. #usr/bin/perl -w
  2. #auth:ly@guess.pl
  3. print"\t let's begin guess magic number!^_^\t\n";
  4. #生成秘数
  5. $magic_num=int(1+ rand 100);
  6. #猜谜
  7. while(1){
  8. print">guess(1~100):";
  9. $guess=<STDIN>;
  10. chop$guess;
  11. #对输入执行判断,是否越界或属于命令字符
  12.      if(int($guess)>100 or int($guess)<1){
  13.                 if($guess=="quit" or $guess=="exit" or $guess=""){
  14.                                                 last;
  15.                                 }
  16.         print"your input is overlap!!!try again\n";
  17.              }
  18. #猜数过程
  19.      if(int($guess)>$magic_num ){
  20.      print"too high...\ntry again\n";       
  21.              }       
  22.      if(int($guess)<$magic_num ){
  23.      print"too low...\ntry again\n";       
  24.              }       
  25.      if(int($guess)==$magic_num){
  26.      print "^_^,that's right!\n";
  27.      last;       
  28.              }       
  29.        
  30.         }
复制代码
8.
  1. #!/usr/bin/perl -w
  2. use IO::Socket;
  3. use Net::hostent;

  4. print ">give a service port:";
  5. $PORT = <STDIN>;       
  6. chop $PORT;

  7. $server = IO::Socket::INET->new( Proto => 'tcp',  LocalPort => $PORT,  Listen    => SOMAXCONN,  Reuse     => 1);
  8. die "can't setup server" unless $server;
  9. print "[Server $0 accepting clients]\n";

  10. while ($client = $server->accept()) {
  11.          $client->autoflush(1);
  12.          $hostinfo = gethostbyaddr($client->peeraddr);
  13.          if ($kidpid) {         
  14.          while ( $line=<$client>) {
  15.                   next unless /\S/;             # blank line
  16.                      if    (/quit|exit/i)    {
  17.                              last;         
  18.                              }         
  19.                     else {       print STDOUT $line;     }   
  20.                    }
  21.         kill("HUP", $kidpid);}
  22.         else{
  23.                              close $client; }
  24. }
复制代码

论坛徽章:
0
84 [报告]
发表于 2011-03-16 19:23 |只看该作者
回复的晚了,主要是这几天比较忙,没有时间看,趁中午休息时,弄了一下,发现好多东西还没看好,像ipc像进程处理等等,希望对我上面的答案给个建议,谢谢。。。一直以来一个人用perl,大家都整shell,好孤独啊。。

论坛徽章:
0
85 [报告]
发表于 2011-03-16 22:22 |只看该作者
第1题:


  1. sub myfunc

  2. {

  3.         #my $x = ...;



  4.         return $x ?  1 :  0;

  5. }

复制代码
第2题:



$x=(); 的结果是:  undef



列表位于标量上下文是什么情况? 列表的值依次赋给标量。只有列表的最后一个值会被保存在变量中。



()是不是用来创建空的list ?  不是, 在上下文环境中, 它只是一个标量。





第3题:



暂时空着





第4题:

4.@x=(5,7,9); $x[1]与@x[1]的区别是什么?



$x[1] 是采用标量的形式返回结果

@x[1] 是以列表形式返回。可以写成  my ($x1,$x2) = @x[0,1];



第5题:


  1. #!/usr/bin/perl

  2. use strict;

  3. use warnings;



  4. my @files = <C:/*>;



  5. &new_find(\@files);



  6. #------------------------------------------------------------------------

  7. sub new_find

  8. {

  9.         my $files = shift;



  10.         &print_data($files);

  11.        

  12.         foreach my $file (@{$files})

  13.         {

  14.                 if (-d $file)

  15.                 {

  16.                         my @files = <$file/*>;

  17.                         &new_find(\@files);

  18.                 }

  19.         }

  20. }

  21.        



  22. sub print_data

  23. {

  24.         my $dt = shift;

  25.         if  (scalar @$dt > 0)

  26.         {

  27.                 my @files =  sort { (-M $a) <=> (-M $b) } @{$dt};

  28.                 print '-'x80,"\n";

  29.                 print "$_\n" foreach (@files);

  30.         }

  31. }



复制代码
第6题:

6.传入一串数字并返回所有大于平均值的数字。


  1. #!/usr/bin/perl

  2. use strict;

  3. use warnings;





  4. my $str = <>;

  5. my @num = (split /\s+/,$str);



  6. my $abc = &get_up_average(\@num);



  7. print "@{$abc}\n";



  8. #====================================

  9. sub get_up_average($)

  10. {

  11.         my $num = shift;

  12.         my ($sum,$c,@up_ave) ;

  13.        

  14.         foreach  (@$num)

  15.         {

  16.                 $sum += int($_);

  17.                 $c++;

  18.         }

  19.        

  20.         my $average = $sum / $c;

  21.        

  22.         @$num = reverse sort @$num ;



  23.         foreach  (@$num)

  24.         {

  25.                 if ($_ > $average)

  26.                 {

  27.                         push @up_ave,$_;

  28.                 }

  29.                 else

  30.                 {

  31.                         last;

  32.                 }

  33.         }



  34.         return \@up_ave;

  35. }

复制代码
第7题


  1. #!/usr/bin/perl

  2. use strict;

  3. use warnings;



  4. my $n  = int(1 + rand 100);



  5. while (1)

  6. {

  7.         print "请输入你猜测的数并按回车";

  8.         my $in = <>;

  9.         chomp($in);

  10.         last if ($in =~ /quit|exit|$n/);



  11.         $n > $in ? print "too low\n" : print "too high\n";

  12. }

复制代码
第8题,没有时间写了. 呵呵! 下次有机会再参加!

论坛徽章:
0
86 [报告]
发表于 2011-03-21 18:02 |只看该作者
本来还为错过大赛很遗憾,结果一看题目一题都不会。。。
学习呀学习呀

论坛徽章:
0
87 [报告]
发表于 2011-03-23 12:15 |只看该作者
应该通过邮箱发送邮件来参加,这样直接就贴出来了,很难保证公平,呵呵

---一点小建议

论坛徽章:
0
88 [报告]
发表于 2011-03-25 18:51 |只看该作者
。。。。。。。。。。。。。

论坛徽章:
0
89 [报告]
发表于 2011-03-26 14:51 |只看该作者
看到了呢

论坛徽章:
0
90 [报告]
发表于 2011-03-28 20:58 |只看该作者
什么时候举办个python啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP