免费注册 查看新帖 |

Chinaunix

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

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

论坛徽章:
0
101 [报告]
发表于 2012-03-20 20:08 |只看该作者

1. 请正确的精简如下代码。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return;
    }
}
#################################################################
sub myfunc {
        return unless $x;
        1;
}
################################################################



2. $x=()结果是什么?列表位于标量上下文是什么情况?()是不是用来创建空的list?请解释原因。
#################################################################
$x=()这个语句导致$x的结果时undef,列表位于标量上下文时,返回的结果时一个标量值,即列表的长度,()是来创建一个空的列表
###############################################################

3. 1,2,3,5,6,7,8 如何合并成1-3,5-8?
##################################################################
1..3,5..8
#################################################################

4.@x=(5,7,9); $x[1]与@x[1]的区别是什么?
################################################################
$x[1]是一个数组@x的其中下标为1的标量值,其标量值是7,@x[1]是一个数组,这个数组里只有一个标量值7
####################################################################

5. 用最短和优的perl代码对当前目录下的文件和子目录按修改时间进行排序。
############################################################
#!/usr/bin/perl

print sort { -M $a <=> -M $b } glob "~/*";
##########################################################

6.传入一串数字并返回所有大于平均值的数字。
############################################################
#!/usr/bin/perl

my @list;
while(my $str = <STDIN> {
        chomp $str;
        last unless $str;
        push @list, $str;
}

my $count = @list;
my $sum;
foreach (@list) {
        $sum += $_;
}
my $average = $sum / $count;

print grep { $_ > $average } @list;
###########################################################

7.让用户不断猜测范围从1到100的秘密数字,直到猜中为止。程序应该以魔术公式lnt(1+rand 100)来随机产生秘密数字。当用户猜错时,程序应相应“too high”或者“too low”。如果用户quit或者exit或者键入一个空白行程序就中止。当然如果用户猜到了,程序也应该中止。

###################################################################
#!/usr/bin/perl

my $secretnum = int ( 1 + rand (100));

while (my $in = <STDIN>{
        chomp $in;
        exit 0 if($in =~ /^(quit|exit|\h+)$/);

        if($in > $secretnum){
                print "too high\n";
        } elsif ($in < $secretnum){
                print "too low\n";
        } else {
                exit 0;
        }
}
###################################################################

8. 写一个简单的TCP Echo Server,在linux/unix环境运行,侦听在特定端口,接受用户的网络输入,并返回同样的数据给对方,能接受quit命令。
基本要求:
(1)无阻塞IO。
(2)daemon方式运行。
(3)能接受kill -HUP重启信号。

##############################################################################
TCP Echo Server端的代码如下:
#!/usr/bin/perl
#将这段代码保存为server.pl文件,使用的时候输入perl server.pl &
use IO::Socket;
use IO::Select;
use POSIX;

$main_sock = new IO::Socket::INET (        LocalAddr        => 'localhost',
                                        LocalPort        => 9000,
                                        Proto                => 'tcp',
                                        Listen                => 5,
                                        Reuse                => 1,
                                        );
die "TCP Echo Server could not be created! !" unless $main_sock;

$handles = new IO::Select();
$handles->add($main_sock);

while(1){
        ($new_readalbe) = IO::Select->select($handles,undef,undef,undef);
        foreach $sock(@$new_readalbe){
                if($sock == $main_sock){
                        $new_sock = $sock->accept();
                        fcntl($new_sock, F_SETFL(), O_NONBLOCK());
                        $handles->add($new_sock);
                } else {
                        $buf = <$sock>;
                        if($buf){
                                chomp $buf;
                                if($buf =~ /^quit$/){
                                        $handles->remove($sock);
                                        close $sock;
                                        next;
                                }
                                print $sock "$buf\n";
                               
                        } else {
                                $handles->remove($sock);
                                close $sock;
                        }
                }
        }
}

作为测试,同时提供了TCP客户端,代码如下:
#!/usr/bin/perl
#将这段代码保存为client.pl文件,在终端输入命令:perl client.pl即可
use POSIX;
use IO::Socket;
use IO::Select;

$sock = new IO::Socket::INET (        PeerAddr        => '127.0.0.1',
                                PeerPort        => 9000,
                                Proto                => 'tcp',
                                );

die "TCP Client could not connect to SERVER!!" unless $sock;

while(my $input = <STDIN>{
        chomp $input;
        unless ($input) {
                close $sock;
                exit 0;
        }
        print "发送出去了\n";
        print $sock "$input\n";
        if($input =~ /^quit$/){
                close $sock;
                exit 0;
        }
        my $show = <$sock>;
        print "$show";
}
##############################################################################

论坛徽章:
0
102 [报告]
发表于 2012-03-27 10:44 |只看该作者
好可惜,没有赶上.

论坛徽章:
0
103 [报告]
发表于 2012-03-30 15:57 |只看该作者
第三题是什么意思?看了半天也没看懂。

论坛徽章:
0
104 [报告]
发表于 2013-06-21 12:31 |只看该作者

1. 请正确的精简如下代码。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return;
    }
}

sub myfunc {
   return $x ? : 1 0
}

2. $x=()结果是什么?列表位于标量上下文是什么情况?()是不是用来创建空的list?请解释原因。
结果是空,如果有列表,x会拿到最后一个元素;
()可以用来创建empty list


3. 1,2,3,5,6,7,8 如何合并成1-3,5-8?
@a=(1,2,3,5,6,7,;
$i=$j=0;
while($i<@a){
  $j=$i;
  $matched=0;
  $start=$i;
  while( $a[$i]+1 eq $a[$j+1] ){
     $matched=1;
     $j++;
     $i=$j;
  }
  if($matched){
    push(@res,"$a[$start]-$a[$j]";
    $i=$j;
    next;
  }
  else{
   push(@res,$a[$i]) unless $a[$i-1] eq $a[$i]-1;
     $i++;
  }
}
print join(",",@res),"\n";


4.@x=(5,7,9); $x[1]与@x[1]的区别是什么?
好像没啥区别,就是“回字”的几种写法吧


后面时间空了继续


论坛徽章:
7
戌狗
日期:2013-12-15 20:43:38技术图书徽章
日期:2014-03-05 01:33:12技术图书徽章
日期:2014-03-15 20:31:17未羊
日期:2014-03-25 23:48:20丑牛
日期:2014-04-07 22:37:44巳蛇
日期:2014-04-11 21:58:0915-16赛季CBA联赛之青岛
日期:2016-03-17 20:36:13
105 [报告]
发表于 2013-06-22 15:43 |只看该作者
这里面的题目好NAN{:3_188:}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP