亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

Chinaunix

標(biāo)題: ChinaUnix技術(shù)實(shí)踐之三——Perl編程大賽 [打印本頁]

作者: 無風(fēng)之谷    時(shí)間: 2011-02-24 16:43
標(biāo)題: ChinaUnix技術(shù)實(shí)踐之三——Perl編程大賽
獲獎(jiǎng)名單已公布,詳情請(qǐng)看:http://72891.cn/thread-2293632-1-1.html   

Perl版塊在ChinaUnix社區(qū)內(nèi)一直是CU的技術(shù)討論比較熱烈的版塊。之前我們已經(jīng)成功舉辦了PHP和C/C++的程序設(shè)計(jì)大賽,今天我們舉辦第三期perl的程序設(shè)計(jì)大賽,發(fā)揮您的技術(shù)之長,贏取我們?yōu)閮?yōu)勝者準(zhǔn)備的豐富獎(jiǎng)品,歡迎大家踴躍參加!

第一期:PHP編程大賽 http://72891.cn/thread-1788191-1-1.html
第二期:C/C++編程大賽http://72891.cn/thread-1820953-1-1.html

參賽要求:參與活動(dòng)必須是chinaunix社區(qū)的注冊(cè)會(huì)員

點(diǎn)擊注冊(cè): http://sso.chinaunix.net/Register

大賽日程:

參賽時(shí)間:2011.2.24~2011.03.16

評(píng)選時(shí)間:2011.3.17~2011.3.24

結(jié)果公布:2011.03.25

獎(jiǎng)項(xiàng)設(shè)置:
一等獎(jiǎng):3名,贈(zèng)送KingCamp威尼斯戶外背包(25升)一件,市場價(jià)328元。        
二等獎(jiǎng):10名,贈(zèng)送特別定制版ChinaUnix商務(wù)襯衫,獲獎(jiǎng)?wù)邽樽钕日_完成7道試題的十名用戶,市場價(jià)258元。
三等獎(jiǎng):15名,贈(zèng)送ChinaUnix 9周年限量版ChinaUnix春秋長袖T恤,獲獎(jiǎng)?wù)邽樽钕日_完成6道試題的十名用戶,市場價(jià)198元。

活動(dòng)細(xì)則:
(1)代碼規(guī)范:使用標(biāo)準(zhǔn)Perl語言,采用編程標(biāo)準(zhǔn)可以使項(xiàng)目更加順利地完成。
(2)性能:應(yīng)用程序可以運(yùn)行與高效運(yùn)行是兩個(gè)層次,保證程序的最佳效率。
(3)簡潔:寫代碼是一種藝術(shù)。除了正確的縮進(jìn)、大小寫、命名規(guī)則之外,請(qǐng)時(shí)刻牢記愛因斯坦的名言--簡單就是美。
(4)每位會(huì)員可以發(fā)表多個(gè)代碼,以最高評(píng)價(jià)為準(zhǔn),不可重復(fù)獲獎(jiǎng);
(5)提交代碼請(qǐng)跟帖發(fā)表,并附相關(guān)系統(tǒng)環(huán)境及編譯環(huán)境說明。
評(píng)選獲獎(jiǎng)的依據(jù):答題的時(shí)間及答題的質(zhì)量為依據(jù),邀請(qǐng)嘉賓作為評(píng)選人。

代碼提交:
參賽者以跟帖的方式提交代碼,相似代碼以最先提交為準(zhǔn),誰最早提交誰優(yōu)秀。
注:嚴(yán)禁抄襲,一經(jīng)發(fā)現(xiàn),取消評(píng)選資格;


大賽評(píng)委團(tuán):

蘭花仙子:ChinaUnix Perl資深版主,10年P(guān)erl編程經(jīng)驗(yàn),用Perl實(shí)際參與過許多大型系統(tǒng)的設(shè)計(jì)開發(fā)
Flw:       ChinaUnix Perl資深版主,網(wǎng)友熟知Perl版牛人。
2gua:    研究各種開源軟件/語言技術(shù),從Perl 5.0開始關(guān)注Perl。
更多嘉賓正在邀請(qǐng)中,歡迎自薦。

大賽聯(lián)系人:
無風(fēng)之谷 xuguangyao@it68.com QQ:19721714

大賽試題:

1. 請(qǐng)正確的精簡如下代碼。

sub myfunc {
    # $x = ...;

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


2. $x=()結(jié)果是什么?列表位于標(biāo)量上下文是什么情況?()是不是用來創(chuàng)建空的list?請(qǐng)解釋原因。

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

4.@x=(5,7,9); $x[1]與@x[1]的區(qū)別是什么?

5. 用最短和優(yōu)的perl代碼對(duì)當(dāng)前目錄下的文件和子目錄按修改時(shí)間進(jìn)行排序。

6.傳入一串?dāng)?shù)字并返回所有大于平均值的數(shù)字。

7.讓用戶不斷猜測范圍從1到100的秘密數(shù)字,直到猜中為止。程序應(yīng)該以魔術(shù)公式lnt(1+rand 100)來隨機(jī)產(chǎn)生秘密數(shù)字。當(dāng)用戶猜錯(cuò)時(shí),程序應(yīng)相應(yīng)“too high”或者“too low”。如果用戶quit或者exit或者鍵入一個(gè)空白行程序就中止。當(dāng)然如果用戶猜到了,程序也應(yīng)該中止。

8. 寫一個(gè)簡單的TCP Echo Server,在linux/unix環(huán)境運(yùn)行,偵聽在特定端口,接受用戶的網(wǎng)絡(luò)輸入,并返回同樣的數(shù)據(jù)給對(duì)方,能接受quit命令。
基本要求:
(1)無阻塞IO。
(2)daemon方式運(yùn)行。
(3)能接受kill -HUP重啟信號(hào)。
作者: flw    時(shí)間: 2011-02-24 17:19
我靠,這里面的題目我都不會(huì),仙子香吻估計(jì)只能通過私人渠道了。
作者: action08    時(shí)間: 2011-02-24 17:25
1. 請(qǐng)正確的精簡如下代碼。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return; // perl 可以直接 return novalue?
    }
}
作者: Monox    時(shí)間: 2011-02-24 17:37
我試著回答一下吧,看我可以完成多少。一題一貼:
1.

  1. sub myfunc {
  2.     # $x = ...;

  3.     $x and 1;
  4. }
復(fù)制代碼

作者: Monox    時(shí)間: 2011-02-24 17:38
2. 結(jié)果是 undef。列表在標(biāo)量上下文中返回最后一個(gè)元素。() 是用來創(chuàng)建空的 list 的。原因:

在 Perl 5 中,數(shù)組在標(biāo)量上下文中返回它的大小,但是列表與數(shù)組不同,它會(huì)返回列表的最后一個(gè)無素。不像 Perl 6 中,構(gòu)建列表的是 ",",在 Perl 5 中,列表由 “(” 和 “)“ 創(chuàng)建,() 創(chuàng)建的是空列表,它沒有元素,也就是無定義,因此在標(biāo)量環(huán)境下返回的是 undef。
作者: Monox    時(shí)間: 2011-02-24 17:38
3.

  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my @numbers = (1,2,3, 5,6,7,8);
  5. my $last_no = shift @numbers;
  6. my @tmp = [$last_no, $last_no];
  7. for my $no (@numbers) {
  8.     if ($no - $last_no == 1) {
  9.         $tmp[$#tmp][1] = $last_no = $no
  10.     } else {
  11.         push @tmp, [$no, $no];
  12.         $last_no = $no;
  13.     }
  14. }

  15. my @result;
  16. for my $r_range (@tmp) {
  17.     push @result, $r_range->[0] == $r_range->[1] ? $r_range->[0] : join "-", @$r_range;
  18. }
  19. print join ",", @result;
復(fù)制代碼

作者: Monox    時(shí)間: 2011-02-24 17:39
4. $x[1] 是標(biāo)量,@x[1] 是 slice,也就是列表,盡管它的長度為1。
作者: Monox    時(shí)間: 2011-02-24 17:50
第五題先空著,之后在寫,
6.

  1. #!/usr/bin/env perl

  2. use 5.12.0;

  3. my @numbers = @ARGV;
  4. my $average = 0;
  5. $average   += $_ for @numbers;
  6. $average   /= @numbers;
  7. say $average;

  8. say join "\t", grep { $_ > $average} @numbers;
復(fù)制代碼
把要處理的數(shù)字從命令行傳入。
作者: xfoucs    時(shí)間: 2011-02-24 18:08
先聲明下,我是新手,正在看Learning Perl 第五版,來湊個(gè)熱鬧 。。。

1. 請(qǐng)正確的精簡如下代碼。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return;
    }
}
#########################################
sub myfunc{
    #$x= ...;
    $x?1:return;
}
#########################################

2. $x=()結(jié)果是什么?列表位于標(biāo)量上下文是什么情況?()是不是用來創(chuàng)建空的list?請(qǐng)解釋原因。
#########################################
$x 是 undef
列表位于標(biāo)量上下文應(yīng)該返回最后一個(gè)元素,此處()空列表所以返回undef
#########################################

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

4.@x=(5,7,9); $x[1]與@x[1]的區(qū)別是什么?
#########################################
@x[1]還沒見過。。。
#########################################

5. 用最短和優(yōu)的perl代碼對(duì)當(dāng)前目錄下的文件和子目錄按修改時(shí)間進(jìn)行排序。
#########################################
最短的 my @sorted=sort {(-M $a)<=>(-M $b)} (<*>);

最優(yōu)的 opendir? 不會(huì)優(yōu)化, 等待高手。。。
#########################################

6.傳入一串?dāng)?shù)字并返回所有大于平均值的數(shù)字。
#########################################
sub hi_everage
{
    my ($everage,$sum)=(0,0);
    my @high=();
    foreach(@_)
    {
        $sum+=$_;
    }
    $everage=$sum/@_;
   
    foreach(@_)
    {
        if($_>$everage)
        {
            push @high,$_;
        }
    }
   
    return @high;
}
#########################################

7.讓用戶不斷猜測范圍從1到100的秘密數(shù)字,直到猜中為止。程序應(yīng)該以魔術(shù)公式lnt(1+rand 100)來隨機(jī)產(chǎn)生秘密數(shù)字。當(dāng)用戶猜錯(cuò)時(shí),程序應(yīng)相應(yīng)“too high”或者“too low”。如果用戶quit或者exit或者鍵入一個(gè)空白行程序就中止。當(dāng)然如果用戶猜到了,程序也應(yīng)該中止。
#########################################
#!/usr/bin/perl -w
use strict;
use 5.010;

my $secret=int(1+rand 100);
my $guess;

print "Guess the secret: ";
while($guess=<STDIN>)
{
     chomp $guess;
     given($guess)
     {
        when(/[^\d+]|^\s*$/){say "input error";}
        when($_==$secret){say "you got it!";last}
        when($_<$secret){say "too low";}
        when($_>$secret){say "too high"}
        when(/exit|quit/){say "bye~";}
     }
}
#########################################


8. 寫一個(gè)簡單的TCP Echo Server,在linux/unix環(huán)境運(yùn)行,偵聽在特定端口,接受用戶的網(wǎng)絡(luò)輸入,并返回同樣的數(shù)據(jù)給對(duì)方,能接受quit命令。
基本要求:
(1)無阻塞IO。
(2)daemon方式運(yùn)行。
(3)能接受kill -HUP重啟信號(hào)。

#########################################
Learning Perl 還沒看完,完全不會(huì)。。。
#########################################
作者: Monox    時(shí)間: 2011-02-24 18:09
7.
  1. #!/usr/bin/env perl

  2. use 5.12.0;

  3. my $secret = int (1+rand 100);

  4. print "Your guess: ";
  5. while (my $guess = <>) {
  6.     chomp $guess;
  7.     exit unless $guess;
  8.     exit if $guess ~~ ['quit', 'exit'];
  9.     exit if $guess == $secret;
  10.     $guess > $secret ? print "Too high. You guess again: " : print "Too low. Your guess again: ";
  11. }
復(fù)制代碼
吃飯去了
作者: xfoucs    時(shí)間: 2011-02-24 18:11
本帖最后由 xfoucs 于 2011-02-26 21:59 編輯

回復(fù) 9# xfoucs


    3. 1,2,3,5,6,7,8 如何合并成1-3,5-8?
這道題也不會(huì)。。。


------------------------------------------------
4.@x=(5,7,9); $x[1]與@x[1]的區(qū)別是什么?
#########################################
$x[1]是數(shù)組第二個(gè)元素標(biāo)量7
@x[1]是數(shù)組切片后的只含一個(gè)元素7的列表

剛看完 learning perl 。。。

#########################################
作者: Monox    時(shí)間: 2011-02-24 18:41
5.

  1. #!/usr/bin/env perl

  2. use 5.12.0;

  3. my @sorted = map { $_->[1] } sort { $a->[0] <=> $b->[0] } map { [-M $_, $_] } glob "*";
  4. say join "\t", @sorted;
復(fù)制代碼

作者: Monox    時(shí)間: 2011-02-24 18:45
第8題 Socket 編程,從來沒去管過。嗯,還有很多其他事情要做,就不去翻資料了,這題棄權(quán)。
作者: Jerll    時(shí)間: 2011-02-24 20:47
第六 七題好像是learning perl 里面的原題啊
作者: aplah    時(shí)間: 2011-02-24 21:50
全是高手啊,俺進(jìn)來走個(gè)場
作者: rubylc_unix    時(shí)間: 2011-02-25 08:34
本帖最后由 rubylc_unix 于 2011-02-25 09:29 編輯

系統(tǒng)環(huán)境:
              This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi
              Copyright 1987-2009, Larry Wall


4.當(dāng)我們從數(shù)組獲得元素值的時(shí)候,需要使用$,因?yàn)槲覀冎灰@取數(shù)組里的一個(gè)值;你請(qǐng)求一個(gè)標(biāo)量,然后會(huì)獲得一個(gè)標(biāo)量。
   如果從數(shù)組里獲取多個(gè)值,使用@,因?yàn)槲覀円@取數(shù)組里的幾個(gè)值(列表),這叫“數(shù)組切片”。
   $x[1]和@x[1]都是取數(shù)組中的第二個(gè)元素,但是因?yàn)?和@的不同,一個(gè)是取一個(gè)數(shù)時(shí)用的,一個(gè)是取一組數(shù)時(shí)用的,雖然該題目只取一個(gè)數(shù)字。
作者: ypxns    時(shí)間: 2011-02-25 10:17
perl新人,哈哈!~!

第1道題



  1. sub myfunc {

  2.         return 1 if $x ;

  3. }
復(fù)制代碼

作者: renxiao2003    時(shí)間: 2011-02-25 10:48
唉。沒看到。馬上參加。對(duì)了C++的還沒有平出來啊。
作者: ypxns    時(shí)間: 2011-02-25 11:19
第六道題:
  1. #!/usr/bin/perl

  2. use warnings;

  3. print "Enter some number,a number per line and type CTL+d to end:\n";

  4. chomp(@numbers = <STDIN>);

  5. foreach  (@numbers) {
  6.        $sum += $_ ;
  7. }

  8. print "The number are : \n",join ",",grep { $_ > $sum / ($#numbers + 1) } @numbers;
  9. print "\n";
復(fù)制代碼
不練練 就忘記啦~!
作者: ypxns    時(shí)間: 2011-02-25 11:38
第7道題:
  1. #!/usr/bin/perl

  2. use warnings;
  3. use strict;

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

  5. print "Please guess a number between 1 and 100: ";
  6. while (<STDIN>) {
  7.         last if /quit|exit/i;
  8.         print "Too high\n" if $_ > $random_number ;
  9.         print "Too low\n" if $_ < $random_number ;
  10.         if ($_ == $random_number) {
  11.                 print "Your guess it.\n";
  12.                 last;
  13.         }
  14. }
復(fù)制代碼

作者: strike2000mr    時(shí)間: 2011-02-25 12:00
本帖最后由 strike2000mr 于 2011-02-26 16:00 編輯

3.把1,2,3,5,6,7,8 當(dāng)成是字符串也行吧,有正則表達(dá)式不是很快嘛
#!/usr/bin/perl
my $string=q/1,2,3,5,6,7,8/;
string=~s/,2,|,6,7,/-/g;
print $string;
,(\d+,)+
filename:test
  1. #!/usr/bin/perl
  2. my $string=join ",",@ARGV;
  3. foreach $_(@ARGV){
  4.              my $var=$_+1;
  5.              $string=~s/($_),($var)/$_ $var/;
  6. }
  7. $string=~s/ (\d+ )+/-/g;
  8. print $string;
復(fù)制代碼
#perl test 1 2 3 5 6 7 8
作者: Monox    時(shí)間: 2011-02-25 12:16
回復(fù) 21# strike2000mr

那你還不如:

  1. my $string = "1,2,3,5,6,7,8";
  2. $string = "1-3,5-8";
  3. print $string;
復(fù)制代碼
純個(gè)人觀點(diǎn),不同意的也沒關(guān)系,哈哈,我覺得寫程序關(guān)鍵是要培養(yǎng)一種思維方式和習(xí)慣。要知道為什么要寫程序,這樣的程序方不方便擴(kuò)展,普適性,等等。
作者: renxiao2003    時(shí)間: 2011-02-25 12:18
都是高手啊?磥怼捌啤闭Z言我鎮(zhèn)的不太會(huì)啊。周末在家查查資料正正。
作者: wb112200    時(shí)間: 2011-02-25 14:27
你們都把題公布出來了 要求不是要發(fā)郵件的么 破壞比賽規(guī)則嘛 呵呵
作者: zhlong8    時(shí)間: 2011-02-25 14:57
本帖最后由 zhlong8 于 2011-02-25 15:24 編輯

#1
sub myfunc { $x ? 1 : return}

#2
# 經(jīng)測試 $x=() 結(jié)果是 undef
# 列表位于標(biāo)量上下文結(jié)果是列表中元素?cái)?shù)目
# () 是用來創(chuàng)建空列表的
# 此處結(jié)果為 undef 是編譯器的選擇,因?yàn)檫@里可以有多種解釋

#4
# $x[1] 為取數(shù)組 @x 的第 1 個(gè)元素(從0開始)
# @x[1] 為 slice 返回的是個(gè)列表

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

  2. use 5.012;

  3. my $s = $ARGV[0];
  4. $s =~ s/\s//g;

  5. while ($s =~ s/(?<=\d)  # a-b,c '-'只能出現(xiàn)在數(shù)字后面
  6.     -(\d+),             # 捕獲 b
  7.     ((??{$1+1}))        # 判斷 c 是否等于 b+1
  8.     (?=,|$)             # c 后面只能是字符串結(jié)束或 ','
  9.     /-$2/x or
  10.     $s =~ s/(?|^(\d++), # a,b 結(jié)構(gòu)只能出現(xiàn)在字符串首部或者 a 在 ',' 后
  11.     ((??{$1+1}))        # 判斷 b 是否等于 a + 1
  12.     |(?<=,)             # a 在 , 后的情況
  13.     (\d++),((??{$1+1})))
  14.     (?=,|$)             # b 后面只能是字符串結(jié)束或 , 防止 b 捕獲位數(shù)不全
  15.     /$1-$2/x
  16. ) {
  17.     say $s;
  18. }
  19. say "result: $s";
復(fù)制代碼
#5
  1. #!/usr/bin/perl -w

  2. use 5.012;
  3. use Cwd;
  4. use Data::Dumper;

  5. my @mtime;
  6. for (glob cwd . '/*') {
  7.     push @mtime, [$_, (stat)[9]];
  8. }

  9. @mtime = sort {$a->[1] <=> $b->[1]} @mtime;

  10. print Dumper \@mtime;
復(fù)制代碼
#7
  1. #!/usr/bin/perl -w

  2. use 5.012;

  3. my $secret = int (1+rand 100);

  4. print "guess a integer from 1 to 100\n> ";

  5. while (<>) {
  6.     last if /^\s*(?:quit|exit)?\s*$/;
  7.     unless (/^\s*\d+\s*$/) {
  8.         say 'input a integer please!';
  9.         next;
  10.     }
  11.     given ($_ <=> $secret) {
  12.         when (-1) { say 'too low'}
  13.         when (0)  { say "you got it, it's $secret"; last}
  14.         when (1)  { say 'too high'}
  15.     }
  16. } continue {
  17.     print "> ";
  18. }
復(fù)制代碼
#6
  1. #!/usr/bin/perl -w

  2. use 5.012;

  3. sub func6 {
  4.     my $sum = 0;
  5.     $sum += $_ for @_;
  6.     my $mean = $sum/@_;
  7.     grep {$_ > $mean} @_;
  8. }
復(fù)制代碼
#8另發(fā)
作者: icecobra    時(shí)間: 2011-02-25 17:03
關(guān)注。。。。
作者: yybmsrs    時(shí)間: 2011-02-25 17:08
慢慢做。。。
1.
  1. sub myfunc {
  2.         # $x = ...;
  3.         1 if $x;
  4. }
復(fù)制代碼
2.$x=()結(jié)果為undef,也就是未定義。列表在標(biāo)量上下文中相當(dāng)于逗號(hào)操作符,表示列表中最后一個(gè)元素的值。是,()相當(dāng)于,(undef,undef......)。

3.
  1. my $foo = '1,2,3,5,6,7,8';
  2. my @foo = split /,/,$foo;
  3. my ($start,$i,$end) = ($foo[0])x3;

  4. for(1..$#foo)
  5. {
  6.         $i++;
  7.         if($foo[$_] == $i)
  8.         {
  9.                 $end = $foo[$_];
  10.                 if($_ == $#foo)
  11.                 {
  12.                         print "$start-$end";
  13.                 }
  14.         }
  15.         else
  16.         {
  17.                 if($start == $end)
  18.                 {
  19.                         print "$start,";
  20.                 }
  21.                 else
  22.                 {
  23.                         print "$start-$end,";
  24.                 }
  25.                 $i = $start = $end = $foo[$_];
  26.                 if($_ == $#foo)
  27.                 {
  28.                         print "$end";
  29.                 }
  30.         }
  31. }
復(fù)制代碼
4.@x[1]是$x[1]老的寫法,現(xiàn)在已經(jīng)不用。現(xiàn)在@x[1]還表示一個(gè)array slice。
作者: renxiao2003    時(shí)間: 2011-02-25 17:22
本帖最后由 renxiao2003 于 2011-02-25 17:26 編輯

回復(fù) 24# wb112200


    是啊。大家都直接把答案貼在帖子里(就像PHP大賽)。這樣怎么能不雷同。ㄒ粋(gè)題的答案就那么幾種)。還是C/C++比較規(guī)范。把答案發(fā)EMAIL比較好。
作者: 珞水的大叔    時(shí)間: 2011-02-25 17:22
本帖最后由 珞水的大叔 于 2011-02-27 00:25 編輯

占個(gè)坑先:
1. 答:
  1. sub myfunc {
  2.     # $x = ...;

  3.     $x?1:undef;
  4. }
復(fù)制代碼
2. 答:是未定義;其值為列表中元素個(gè)數(shù),被賦值時(shí)會(huì)只給第0個(gè)元素賦值并拋棄其他元素;
    不是,當(dāng)一個(gè)列表剛被定義時(shí)就是個(gè)空列表,在列表環(huán)境中()可以用來給已含有元素的列表進(jìn)行初始化

3. 答:這個(gè)題目我一個(gè)正則搞定,嘿嘿
  1. my $lala = "1,2,3,5,6,7,8";
  2. while($lala =~ s/(\d+)[-,]((?<=-)\d+|(?<=,)(??{$1+1})),((??{$2+1}))/$1-$3/){};
  3. print $lala,"\n";
復(fù)制代碼
4. 答:這兩個(gè)的值是一樣的,但$x[1]是索引,@x[1]是切片,不過我不清楚具體實(shí)行原理有什么不同,但從以下例子可以知道切片的用途,比如:@y = @x[2,0] 表示 @y = ($x[2],$x[0])

5. 答:如果只要求當(dāng)前目錄下的文件而非所有文件的話,我覺得xfoucs在9樓寫的
  1. my @sorted=sort {(-M $a)<=>(-M $b)} (<*>);
復(fù)制代碼
就很OK
當(dāng)然,如果是當(dāng)前目錄下的所有文件的話,就是多了一個(gè)遍歷所有文件,如下:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. sub ls{
  5.     my @path = @_;
  6.     my @result;
  7.     while(scalar @path > 0){
  8.         my $dir = pop @path;
  9.         chomp $dir;
  10.         if(-d $dir){
  11.             opendir(my $dh, $dir);
  12.             my @tmp = map{"$dir/$_"} grep{$_ !~ /^\.+$/}readdir $dh;
  13.             push @path,@tmp;
  14.             push @result,@tmp;
  15.             closedir $dh;
  16.         }
  17.     }
  18.     return @result;
  19. }

  20. my @sorted = sort {(-M $a)<=>(-M $b)} (ls("."));
  21. print "$_\n" for @sorted;
復(fù)制代碼
6 答:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $sum;
  5. $sum += $_ for @ARGV;
  6. print "$_\n" for grep {$_ >= $sum/@ARGV} @ARGV;
復(fù)制代碼
7. 答:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my $number = int(1+rand 100);
  5. while(<>){
  6.     chomp;
  7.     if(/^quit|exit|\s+$/){
  8.         exit;
  9.     }
  10.     elsif(/\D/ or /^$/){
  11.         print "輸入不符合規(guī)范,請(qǐng)輸入數(shù)字\n";
  12.     }
  13.     elsif($_ > $number){
  14.         print "too high\n";
  15.     }
  16.     elsif($_ < $number){
  17.         print "too low\n";
  18.     }
  19.     elsif($_ == $number){
  20.         print "right!\n";
  21.         exit;
  22.     }
  23. }
復(fù)制代碼

作者: lh_fengyuzhe    時(shí)間: 2011-02-25 19:24
不會(huì)Perl的來看熱鬧
作者: strike2000mr    時(shí)間: 2011-02-25 19:39
本帖最后由 strike2000mr 于 2011-03-09 15:41 編輯

回復(fù) 22# Monox

感謝討教!深以為然!
filename:test1
  1. #!/usr/ibn/perl
  2. my $str=join ",",@ARGV;
  3. $var=$_+1 and $string=~s/($_),($var)/$_ $var/  foreach (@ARGV);
  4. $str=~s/ (\d+ )+/-/g;
  5. print $str;
復(fù)制代碼
3-2
filename:test2
  1. #!/usr/bin/perl
  2. $var=$_-1 and $ARGV[$_]-$ARGV[$var]>1 and $str.="$ARGV[$var],$ARGV[$_]-" foreach(1..$#ARGV);
  3. ($str="$ARGV[0]-$var$ARGV[-1]\n")=~s/(\d+)-\1/$1/g;
  4. print $str;
復(fù)制代碼
#perl test 1 2 3  5 6 7 8
作者: renxiao2003    時(shí)間: 2011-02-25 21:07
本帖最后由 renxiao2003 于 2011-02-28 10:50 編輯

大賽試題:

1.
請(qǐng)正確的精簡如下代碼。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return;
    }
}
答案:
  1. sub myfunc{
  2.     # $x=...;
  3.     $x?1:return;
  4. }
復(fù)制代碼
2. $x=()結(jié)果是什么?列表位于標(biāo)量上下文是什么情況?()是不是用來創(chuàng)建空的list?請(qǐng)解釋原因。
答案:
  1. $x=()結(jié)果是空列表,0個(gè)元素的列表;列表位于標(biāo)量上下文是反轉(zhuǎn)。()用來創(chuàng)建空的list。
復(fù)制代碼
3. 1,2,3,5,6,7,8 如何合并成1-3,5-8?
沒辦法,你們已經(jīng)正則了。我只能用這種老古董的辦法。要不我就是抄襲了啊。
答案:
  1. #!/usr/bin/perl
  2. $str="1,2,3,5,6,7,8";
  3. @array=split(/,/,$str);
  4. $len = @array;
  5. $start=0;
  6. $end=0;
  7. $pos=0;
  8. $startpos=0;
  9. $outstr="";
  10. if ($len>1){
  11.         for($i=0;$i<$len-1;$i++){
  12.             if ($array[$i] + 1 == $array[$i+1]){
  13.                $pos=$i+1;
  14.             }else{
  15.                if ($outstr eq ""){
  16.                    $outstr=$array[$startpos] . "-" . $array[$pos];
  17.                }else{
  18.                    $outstr=$outstr . "," . $array[$startpos] . "-" . $array[$pos];
  19.                }
  20.                $startpos=$i+1;
  21.             }
  22.             if ($pos==$len-1){   
  23.                $outstr=$outstr ."," . $array[$startpos] . "-" . $array[$pos];
  24.             }
  25.         }
  26. }
  27. print $outstr . "\n";
復(fù)制代碼
4.@x=(5,7,9); $x[1]與@x[1]的區(qū)別是什么?
答案:
$是一般變量,而@是數(shù)組變量。但因?yàn)锧x指向的是一個(gè)列表,所以在這里$x[1]與@x[1]輸出是一樣的。

5. 用最短和優(yōu)的perl代碼對(duì)當(dāng)前目錄下的文件和子目錄按修改時(shí)間進(jìn)行排序。
答案:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. print for ( system "ls -lt");
復(fù)制代碼
6.傳入一串?dāng)?shù)字并返回所有大于平均值的數(shù)字。
答案:
  1. #!/usr/bin/perl
  2. print "please input number,user ',' split:\n";
  3. $x=<STDIN>;
  4. @arr=split(/,/,$x);
  5. sub average{
  6.   $len=@arr;
  7.   $sum=0;
  8.   for($i=0;$i<$len;$i++){
  9.     $sum = $sum + @arr[$i];
  10.   }
  11.   return $sum/$len;
  12. }
  13. sub getratheravg{
  14.   $avg=average;
  15.   @arr1;
  16.   for($i=0;$i<@arr;$i++){
  17.     if (@arr[$i]>$avg){
  18.       push(@arr1,@arr[$i]);
  19.     }
  20.   }
  21.   return @arr1;
  22. }
  23. #test
  24. @arrx=getratheravg;
  25. for($i=0;$i<@arrx;$i++){
  26.    print @arrx[$i];print " ";
  27. }
復(fù)制代碼
7.讓用戶不斷猜測范圍從1到100的秘密數(shù)字,直到猜中為止。程序應(yīng)該以魔術(shù)公式lnt(1+rand 100)來隨機(jī)產(chǎn)生秘密數(shù)字。當(dāng)用戶猜錯(cuò)時(shí),程序應(yīng)相應(yīng)“too high”或者“too low”。如果用戶quit或者exit或者鍵入一個(gè)空白行程序就中止。當(dāng)然如果用戶猜到了,程序也應(yīng)該中止。
答案:
  1. #!/usr/bin/perl
  2. $key=int(1+rand 100);
  3. print "please input a number (1~100):\n";
  4. while($guess = <STDIN>)
  5. {
  6.     chomp($guess);
  7.     if ($guess eq "quite" || $guess eq "exit" || $guess =~/\s*/)
  8.     {
  9.          exit(1);
  10.     }
  11.     elsif($guess > $key)
  12.     {
  13.          print "to high\n";
  14.     }
  15.     elsif($guess < $key)
  16.     {
  17.          print "to low\n";
  18.     }
  19.     elsif($guess == $key)
  20.     {
  21.          print "you guess right\n";
  22.          exit;
  23.     }
  24. }
復(fù)制代碼
8. 寫一個(gè)簡單的TCP Echo Server,在linux/unix環(huán)境運(yùn)行,偵聽在特定端口,接受用戶的網(wǎng)絡(luò)輸入,并返回同樣的數(shù)據(jù)給對(duì)方,能接受quit命令。
基本要求:
(1)無阻塞IO。
(2)daemon方式運(yùn)行。
(3)能接受kill -HUP重啟信號(hào)。
作者: horsley    時(shí)間: 2011-02-25 22:36
本帖最后由 horsley 于 2011-02-25 22:37 編輯

接到上面來:

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]的區(qū)別是什么

$x[1] 結(jié)果是標(biāo)量為 7
@x[1]結(jié)果為列表 (7)
作者: rubylc_unix    時(shí)間: 2011-02-26 09:07
第一題:
  1. sub myfunc {
  2.     # $x = ...;

  3.     $x ? 1 : return;
  4. }
復(fù)制代碼

作者: rubylc_unix    時(shí)間: 2011-02-26 09:45
第二題:

1.$x=()是未定義的。
2.列表位于標(biāo)量上下文中返回它的最后一個(gè)元素。
3.是用來創(chuàng)建空list的。
作者: shangat    時(shí)間: 2011-02-26 12:31
本帖最后由 shangat 于 2011-02-26 12:33 編輯

1:
  1. sub myfunc () {
  2.         # $x = ...;
  3.         $x ? 1 : return;
  4. }
復(fù)制代碼
2: $x = () 的結(jié)果: $x = undef。
列表位于標(biāo)量上下文表示的是該列表中最后一個(gè)元素;當(dāng)為空列表時(shí), 該標(biāo)量的值為:undef
新的或者是空的數(shù)組的初始值是空列表 (),在被賦值之前,數(shù)組變量的值是空列表,
清空數(shù)組時(shí)也可直接設(shè)置 @arr = (); 故 ()可以用來創(chuàng)建空的list的。
3:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;
  4. use 5.010;

  5. my %hash;
  6. my ( @arr, $num, $chk, @resu );
  7. chomp ( @arr = sort { $a <=> $b } grep { /\d+/ } split /\s+/, <STDIN> );
  8. print "@arr=>";
  9. $hash{$_} = 0 for ( $arr[0]...$arr[-1] );
  10. for ( keys %hash ) {
  11.         $hash{$_} = 1 if $_ ~~ @arr ;
  12. }
  13. for ( sort { $a <=> $b } keys %hash ) {
  14.         if ( $hash{$_} ) {
  15.                 $chk = 1;
  16.                 $num = $_++;
  17.                 while ( $hash{$_} ) {
  18.                         $num =~ s/^(-?\d+).*/$1-$_/;
  19.                         $hash{$_++} = 0;
  20.                 }
  21.         }
  22.         else { $chk = 0 }
  23.         push @resu, $num if ( $chk );
  24. }
  25. print join "、", @resu, "\n";
復(fù)制代碼
4: $x[1] 代表一個(gè)標(biāo)量,是數(shù)組 @x 的第二個(gè)元素,
@$x[1] 代表一個(gè)數(shù)組, 其中標(biāo)量 $x[1]是一個(gè)數(shù)組引用
5:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. print for ( split / /, system "ls -t" );
復(fù)制代碼
6:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ( @arr, $num );
  5. chomp ( @arr = sort grep { /\d+/ } split /\s+/, <STDIN> );
  6. if ( @arr ) {
  7.         $num += $_ for @arr;
  8.         $num = join "、", grep { $_ > $num / @arr } @arr;
  9.         print "the result is: $num\n";
  10. }
  11. else {
  12.         print "no enter !\n";
  13.         exit( 1 );
  14. }
復(fù)制代碼
7:
  1. #!/usr/bin/perl
  2. use strict;
  3. use warnings;

  4. my ( $result, $guess );
  5. $result = int ( 1 + rand ( 100 ) );
  6. print "Please input an integer ( 1 to 100 ) to make a guess: ";
  7. chomp ( $guess = <STDIN> );
  8. while ( $guess ) {
  9.                 if ( $guess eq "quit" || $guess eq "exit" || $guess =~/\s+/ ) {
  10.                         exit(1);
  11.                 }
  12.                 elsif ( $guess =~/^\d+$/ ) {
  13.                         print "to low \n" if ( $guess < $result );
  14.                         print "to hight \n" if ( $guess > $result );
  15.                         if ( $guess == $result ) {
  16.                                 print "Good, the result is: $guess\n";
  17.                                 exit(1);
  18.                         }
  19.                 }
  20.                 else {
  21.                         print "enter wrong !\n";
  22.                 }
  23.                 print "Again: ";
  24.                 chomp ( $guess = <STDIN> );
  25. }
復(fù)制代碼

作者: yifangyou    時(shí)間: 2011-02-26 23:14
本帖最后由 yifangyou 于 2011-02-27 00:01 編輯
  1. ####################################################
  2. #系統(tǒng)環(huán)境:windows xp sp3,centos 5
  3. #編譯環(huán)境:perl, v5.6.1 built for MSWin32-x86-multi-thread,perl, v5.8.8 built for i386-linux-thread-multi
  4. #執(zhí)行:     perl 1.pl
  5. #題目:
  6. #1. 請(qǐng)正確的精簡如下代碼。
  7. #
  8. #sub myfunc {
  9. #    # $x = ...;
  10. #
  11. #    if ( $x ) {
  12. #        return 1;
  13. #    } else {
  14. #        return;
  15. #    }
  16. #}
  17. #
  18. ####################################################

  19. sub myfunc_yifangyou {
  20.   # $x = ...;
  21.   my $x = shift;
  22.   1 if $x;
  23. }
  24. #輸出沒有參數(shù)的
  25. print "no param:[".myfunc_yifangyou()."]\n";
  26. print "a  param:[".myfunc_yifangyou(454)."]\n";
復(fù)制代碼

作者: yifangyou    時(shí)間: 2011-02-26 23:14
本帖最后由 yifangyou 于 2011-02-27 00:03 編輯
  1. ####################################################
  2. #系統(tǒng)環(huán)境:windows xp sp3,centos 5
  3. #編譯環(huán)境:perl, v5.6.1 built for MSWin32-x86-multi-thread,perl, v5.8.8 built for i386-linux-thread-multi
  4. #執(zhí)行:     perl 2.pl
  5. #題目:
  6. #2. $x=()結(jié)果是什么?列表位于標(biāo)量上下文是什么情況?()是不是用來創(chuàng)建空的list?請(qǐng)解釋原因。
  7. #
  8. ####################################################


  9. #1) $x=()結(jié)果是什么?
  10. #答:$x為空,因?yàn)?x=(2,3,5)這種情況,總是返回最后一個(gè)元素,而()為空列表,因此返回null
  11. $x=();
  12. print "1. x=[".$x."]\n";


  13. #2) 列表位于標(biāo)量上下文是什么情況?
  14. #答:@aList = ("one", "two", "three"); $x = @aList;   當(dāng)把一個(gè)列表賦給一個(gè)數(shù)組變量時(shí),這個(gè)數(shù)組變量在堆棧上放置了數(shù)組的長度,
  15. #因此在列表位于標(biāo)量上下文的情況下,$x只會(huì)取到數(shù)組的長度。
  16. @aList = ("one", "two", "three");
  17. $x = @aList;
  18. print "2. x=[".$x."]\n";

  19. #3) ()是不是用來創(chuàng)建空的list?
  20. #答:是,但是必須是在列表環(huán)境里,例如 @aList=(); 那么@aList就是一個(gè)空列表,若是在標(biāo)量環(huán)境里則是null相同,例如 $x=()

  21. @aList=();
  22. $x=();
  23. print "3. aList=[".scalar(@aList)."],x=[".$x."]\n";
復(fù)制代碼

作者: yifangyou    時(shí)間: 2011-02-26 23:21
本帖最后由 yifangyou 于 2011-02-27 00:03 編輯
  1. ####################################################
  2. #系統(tǒng)環(huán)境:windows xp sp3,centos 5
  3. #編譯環(huán)境:perl, v5.6.1 built for MSWin32-x86-multi-thread,perl, v5.8.8 built for i386-linux-thread-multi
  4. #執(zhí)行:     perl 3.pl 1,2,3,5,6,7,8,24,25,26,2
  5. #題目:
  6. #3. 1,2,3,5,6,7,8 如何合并成1-3,5-8?
  7. #
  8. ####################################################

  9. sub join_int {
  10.   my @result=();
  11.   my $inputlen=@_;
  12.   #若是為空字符串的話,返回空
  13.   return @result if($inputlen==0);
  14.   #若是為1個(gè)數(shù)字的話返回
  15.   return @_ if($inputlen==1);
  16.   #記錄上一個(gè)整數(shù);
  17.   my $last_n=shift(@_);
  18.   #記錄開始的整數(shù)
  19.   my $join_begin=$last_n;
  20.   for my $n (@_) {
  21.           #判斷是否連續(xù)
  22.           if($n!=$last_n+1){
  23.                   #當(dāng)不連續(xù)時(shí)保存到結(jié)果集里
  24.                   if($join_begin==$last_n){
  25.                           push(@result,$join_begin);
  26.                   }else{
  27.                           push(@result,"$join_begin-$last_n");
  28.                   }
  29.                   $last_n=$n;
  30.                   $join_begin=$last_n;
  31.           }else{
  32.                   $last_n=$n;
  33.           }
  34.   }
  35.   #防止最后一個(gè)被遺漏
  36.   if($join_begin==$last_n){
  37.           push(@result,$join_begin);
  38.   }else{
  39.           push(@result,"$join_begin-$last_n");
  40.   }
  41.   return @result;
  42. }
  43. #例子
  44. #print "result:".join(",",join_int(1,2,3,5,6,7,8))."\n";

  45. #判斷輸入合法性
  46. if(!($ARGV[0]=~/(\d+,)*\d+/)){
  47.         die("please add a number list param like 1,2,3,5,6,7,8\n");
  48. }
  49. #分割成數(shù)組
  50. @input_list=split(/,/,$ARGV[0]);
  51. print "input :".join(",",@input_list)."\n";
  52. print "result:".join(",",join_int(@input_list))."\n";
復(fù)制代碼

作者: yifangyou    時(shí)間: 2011-02-26 23:28
本帖最后由 yifangyou 于 2011-02-27 00:04 編輯
  1. ####################################################
  2. #系統(tǒng)環(huán)境:windows xp sp3,centos 5
  3. #編譯環(huán)境:perl, v5.6.1 built for MSWin32-x86-multi-thread,perl, v5.8.8 built for i386-linux-thread-multi
  4. #執(zhí)行:     perl 4.pl
  5. #題目:
  6. #4.@x=(5,7,9); $x[1]與@x[1]的區(qū)別是什么?
  7. #
  8. ####################################################
  9. #答:兩者的返回值都一樣,如下
  10. print"same point:------------------------\n";
  11. @x=(5,7,9);
  12. print '$x[1]=',$x[1],"\n";# 7
  13. print '@x[1]=',@x[1],"\n";# 7

  14. print"\ndiffrerent \$x[1] point:------------------------\n";
  15. #但是$x[1]是一個(gè)標(biāo)量變量,給一個(gè)標(biāo)量變量,賦值,在右手邊就會(huì)以標(biāo)量環(huán)境計(jì)算:
  16. @x=(5,7,9);
  17. $x[1]=8;                   #常數(shù)#這個(gè)得到的結(jié)果和@x[1]是一樣
  18. print '$x[1]=',$x[1],"\n"; # $x[1]=8

  19. @x=(5,7,9);
  20. $x[1]=(10,11,12);          #列表 # 12 # 得到的是最后一個(gè)元素12,這個(gè)得到的結(jié)果和@x[1]是不一樣
  21. print '$x[1]=',$x[1],"\n"; # $x[1]=12

  22. @x=(5,7,9);
  23. @a=('a','b','c');
  24. $x[1]=@a;                  #數(shù)組# 得到的是@a的長度,這個(gè)得到的結(jié)果和@x[1]是不一樣               
  25. print '$x[1]=',$x[1],"\n"; # $x[1]=3

  26. @x=(5,7,9);
  27. $x[1]={10,11,12};          #散列# 得到的是@a的長度,這個(gè)得到的結(jié)果和@x[1]是一樣               
  28. print '$x[1]=',$x[1],"\n"; # $x[1]=散列的地址

  29. print"\ndiffrerent \@x[1] point:------------------------\n";
  30. #@x[1]是一個(gè)列表變量,在右手邊就會(huì)以列表環(huán)境進(jìn)行計(jì)算
  31. @x=(5,7,9);
  32. @x[1]=8;                   #常數(shù)# 8 #這個(gè)得到的結(jié)果和@x[1]是一樣
  33. print '@x[1]=',@x[1],"\n"; # @x[1]=8

  34. @x=(5,7,9);
  35. @x[1]=(10,11,12);          #列表 # (10,11,12) # 得到的是第一個(gè)元素10,這個(gè)得到的結(jié)果和$x[1]是不一樣
  36. print '@x[1]=',@x[1],"\n"; # @x[1]=10

  37. @x=(5,7,9);
  38. @a=('a','b','c');
  39. @x[1]=@a;                  #數(shù)組# 3 # 得到的是@a的第一個(gè)元素,這個(gè)得到的結(jié)果和$x[1]是不一樣   
  40. print '@x[1]=',@x[1],"\n"; # @x[1]='a'

  41. @x=(5,7,9);
  42. @x[1]={10,11,12};          #散列# 得到的是散列的地址,這個(gè)得到的結(jié)果和$x[1]是一樣               
  43. print '@x[1]=',@x[1],"\n"; # @x[1]=散列的地址
復(fù)制代碼

作者: yifangyou    時(shí)間: 2011-02-26 23:33
本帖最后由 yifangyou 于 2011-02-27 00:00 編輯
  1. ####################################################
  2. #系統(tǒng)環(huán)境:windows xp sp3,centos 5
  3. #編譯環(huán)境:perl, v5.6.1 built for MSWin32-x86-multi-thread,perl, v5.8.8 built for i386-linux-thread-multi
  4. #執(zhí)行:     perl 5.pl "E:\tmp" 或者 perl 5.pl
  5. #題目:
  6. #5. 用最短和優(yōu)的perl代碼對(duì)當(dāng)前目錄下的文件和子目錄按修改時(shí)間進(jìn)行排序。
  7. #
  8. ####################################################

  9. #全局結(jié)果集
  10. our %files;
  11. #讀取目錄名
  12. my $inputdir=$ARGV[0];
  13. if($inputdir eq ""){
  14.         $inputdir=".";
  15. }
  16. #當(dāng)前目錄下的文件和子目錄按修改時(shí)間進(jìn)行排序
  17. get_sub_files($inputdir);

  18. #對(duì)散列的修改時(shí)間字段進(jìn)行排序
  19. printf "%10s %s\n", $files{$_},$_ foreach sort {$files{$a} <=> $files{$b};} keys %files;
  20. #my @f =sort {$files{$a} <=> $files{$b};} keys %files;
  21. #foreach my $f ( @f ){
  22. #   printf "%10s %s\n", $f,$files{$f};
  23. #}
  24. #遞歸獲取該目錄下的所有目錄和文件,以及對(duì)應(yīng)的修改時(shí)間
  25. sub get_sub_files{
  26.   my $dir = shift @_;
  27.   #打開目錄
  28.   opendir(DIR,"$dir") || die "Error in opening dir $dir\n";
  29.   my @files =readdir(DIR);
  30.   closedir(DIR);
  31.   #遍歷所有文件和目錄
  32.   for $file (@files){
  33.           #排除當(dāng)前遍歷的目錄和上一級(jí)的目錄
  34.           if(!($file eq "" || $file eq "." || $file eq "..")){
  35.                   my $nextfile="$dir/$file";
  36.             $files{$nextfile}=(stat($file))[9];
  37.             #若是目錄則遞歸變量下一級(jí)
  38.             if(-d $nextfile){
  39.                     get_sub_files($nextfile);
  40.             }
  41.           }
  42.   }
  43. }
復(fù)制代碼

作者: yifangyou    時(shí)間: 2011-02-26 23:36
本帖最后由 yifangyou 于 2011-02-26 23:58 編輯
  1. ####################################################
  2. #系統(tǒng)環(huán)境:windows xp sp3,centos 5
  3. #編譯環(huán)境:perl, v5.6.1 built for MSWin32-x86-multi-thread,perl, v5.8.8 built for i386-linux-thread-multi
  4. #執(zhí)行:     perl 6.pl 1,2,3,5,6,7,8,24,25,26,2
  5. #題目:
  6. #6.傳入一串?dāng)?shù)字并返回所有大于平均值的數(shù)字。
  7. #
  8. ####################################################

  9. sub get_big_avg {
  10.                 my $total = 0;
  11.                 #計(jì)算總和
  12.                 for my $n (@_) {
  13.                         $total+=$n;
  14.                 }
  15.                 my $num=@_;
  16.                 #計(jì)算平均值
  17.                 my $avg=$total/$num;
  18.                 @result=();
  19.                 #比較獲取大于平均值的數(shù)字
  20.     for my $n (@_) {
  21.                         if($n > $avg){
  22.                           push(@result,$n);
  23.                         }
  24.     }
  25.     return @result;
  26. }
  27. #例子
  28. #print "result:".join(",",join_int(1,2,3,5,6,7,8))."\n";

  29. #判斷輸入合法性
  30. if(!($ARGV[0]=~/(\d+,)*\d+/)){
  31.         die("please add a number list param like 1,2,3,5,6,7,8\n");
  32. }
  33. #分割成數(shù)組
  34. @input_list=split(/,/,$ARGV[0]);
  35. print "input :".join(",",@input_list)."\n";
  36. print "result:".join(",",get_big_avg(@input_list))."\n";
復(fù)制代碼

作者: yifangyou    時(shí)間: 2011-02-26 23:37
本帖最后由 yifangyou 于 2011-02-27 16:22 編輯
  1. ####################################################
  2. #系統(tǒng)環(huán)境:centos 5
  3. #編譯環(huán)境:v5.8.8 built for i386-linux-thread-multi
  4. #執(zhí)行:     perl 7.pl
  5. #題目:
  6. #7.讓用戶不斷猜測范圍從1到100的秘密數(shù)字,直到猜中為止。程序應(yīng)該以魔術(shù)公式lnt(1+rand 100)來隨機(jī)產(chǎn)生秘密數(shù)字。
  7. #當(dāng)用戶猜錯(cuò)時(shí),程序應(yīng)相應(yīng)“too high”或者“too low”。
  8. #如果用戶quit或者exit或者鍵入一個(gè)空白行程序就中止。當(dāng)然如果用戶猜到了,程序也應(yīng)該中止。
  9. #
  10. ####################################################

  11. $min_number=1;
  12. $max_number=100;
  13. #獲取隨機(jī)數(shù)
  14. $rand_number=int($min_number+rand($max_number));
  15. print "program have create a randrom num between $min_number and $max_number,enter a number to guess it\n";
  16. print "or enter 'quit' or 'exit' or blank line to exit\n";
  17. $guess_time=0;
  18. while(<STDIN>){
  19.         #獲取輸入并轉(zhuǎn)小寫
  20.         $enter_str = lc($_);
  21.         #去掉空白字符
  22.         $enter_str =~ s/\s//g;
  23.         #判斷是否是整數(shù)
  24.         if(!($enter_str=~/\d+/)){
  25.                 #判斷是否退出
  26.                 if($enter_str eq "exit" || $enter_str eq "quit" || $enter_str eq ""){
  27.                         #退出
  28.                         print("sorry,you lose $guess_time times\n");
  29.                         die("exit ok\n");
  30.                 }
  31.                 print("please enter the number between $min_number and $max_number or enter 'quit' or 'exit' or blank line to exit\n");       
  32.         }else{
  33.                 $guess_time++;
  34.                 #判斷是否相等
  35.                 if($enter_str==$rand_number){
  36.                         #相等則退出
  37.                         print("you win the number is $rand_number,you have guess $guess_time times\n");
  38.                         die("exit ok\n");
  39.                 }else{
  40.                         #提示輸入的是大還是小
  41.                         if($enter_str > $rand_number){
  42.                                 print("too high,you lose $guess_time times\n");
  43.                         }else{
  44.                                 print("too low,you lose $guess_time times\n");
  45.                         }
  46.                 }
  47.         }
  48. }
復(fù)制代碼
第8題
  1. #!/usr/bin/perl
  2. ####################################################
  3. #系統(tǒng)環(huán)境:centos 5
  4. #編譯環(huán)境:perl, v5.8.8 built for i386-linux-thread-multi
  5. #執(zhí)行:     perl 8.pl 或者 perl 8.pl 1234 (端口)
  6. #題目:
  7. #8. 寫一個(gè)簡單的TCP Echo Server,在linux/unix環(huán)境運(yùn)行,偵聽在特定端口,接受用戶的網(wǎng)絡(luò)輸入,并返回同樣的數(shù)據(jù)給對(duì)方,能接受quit命令。
  8. #基本要求:
  9. #(1)無阻塞IO。
  10. #(2)daemon方式運(yùn)行。
  11. #(3)能接受kill -HUP重啟信號(hào)
  12. # 發(fā)送hup信號(hào)命令:kill -s hup 進(jìn)程號(hào)
  13. #
  14. ####################################################
  15. #use POSIX ();
  16. use FindBin ();
  17. use File::Basename ();
  18. use File::Spec::Functions;
  19. use IO::Socket::INET;
  20. use IO::Select;
  21. use Carp;
  22. our $server;
  23. our $server_port=5555;#默認(rèn)端口
  24. our $zombies = 0;
  25. our $script = File::Basename::basename($0);
  26. our $logfile="/tmp/8.log";
  27. our $read_handles;

  28. # 獲取重新啟動(dòng)命令
  29. our $SELF = "perl ".catfile $FindBin::Bin, $script;
  30. our $isrestart=0; #標(biāo)識(shí)是否重新啟動(dòng)
  31. $SIG{CHLD} = sub {$zombies++};
  32. $SIG{HUP} = sub {
  33.         logs("get HUP,restart server");
  34.         $isrestart=1;
  35.         stopServer();
  36. };

  37. #從參數(shù)獲取端口
  38. if(isPort($ARGV[0])){
  39.         $server_port=$ARGV[0];
  40. }
  41. #deamon方式
  42. daemonize();
  43. #啟動(dòng)服務(wù)
  44. startServer();
  45. exit;
  46. #函數(shù)部分-----------------------------------------------
  47. sub isPort{
  48.         my $port=shift(@_);
  49.         if($port=~/d+/){
  50.                 #判斷端口合法性,必須是整數(shù),并且大于1024
  51.                 if($port > 1024){
  52.                         return $port;
  53.                 }
  54.         }       
  55.         return 0;
  56. }

  57. #記錄日志
  58. sub logs{
  59.         my $msg=shift;
  60.         open(LOGFILE,">>$logfile") or die("cannot open $logfile");
  61.                 my($sec,$min,$hour,$mday,$mon,$year)=localtime();
  62.         print LOGFILE sprintf("%04d-%02d-%02d %02d:%02d:%02d ",($year< 2000?($year+1900):$year),($mon+1),$mday,$hour,$min,$sec),$msg,"\n";
  63.         close(LOGFILE);
  64. }

  65. #deamon方式
  66. sub daemonize {
  67.     chdir '/'                 or croak "Can't chdir to /: $!";
  68.     open STDIN, '/dev/null'   or croak "Can't read /dev/null: $!";
  69.     open STDOUT, '>/dev/null' or croak "Can't write to /dev/null: $!";
  70.     defined(my $pid = fork)   or croak "Can't fork: $!";
  71.     exit if $pid;
  72.     setsid                    or croak "Can't start a new session: $!";
  73.     open STDERR, '>&STDOUT'   or croak "Can't dup stdout: $!";
  74. }

  75. # 停止或者重新啟動(dòng)server
  76. sub stopServer{
  77.         $server->close();
  78.         $read_handles->remove($server);
  79.         # 清除所有的客戶端
  80.         foreach $fd ($read_handles->handles){
  81.                 $read_handles->remove($fd);
  82.                 close $fd;       
  83.         }
  84.         logs("server shutdown");
  85.         # 判斷是否重新啟動(dòng)
  86.         if($isrestart==1){
  87.                 $isrestart=0;
  88.                 # 重新啟動(dòng)
  89.                 logs($SELF, @ARGV);
  90.                 exec($SELF, @ARGV) or die "Couldn't restart: $!\n";
  91.         }
  92.         exit;                    # 退出
  93. }
  94. # 啟動(dòng)server
  95. sub startServer{
  96.         # 創(chuàng)建套接字
  97.         $server = IO::Socket::INET->new(
  98.         LocalPort => $server_port,
  99.         Type    => SOCK_STREAM,
  100.         Reuse   => 1,
  101.         Listen   => 10,# 或者 SOMAXCONN
  102.   Blocking  => 0)# 設(shè)置非阻塞   
  103.         or die "Couldn't be a tcp server on port $server_port: $!\n";

  104.         $read_handles = IO::Select->new();
  105.   $read_handles->add($server);
  106.        
  107.         local  $| = 1;
  108.         logs("server start ok binding port $server_port\n");
  109.         my $fds;
  110.         while (1) {
  111.                 ($fds) =IO::Select->select($read_handles, undef, undef,0 );
  112.                 foreach $fd ( @$fds ){
  113.                          if( $fd== $server ){
  114.                                  if($server->opened){
  115.                                          #server收到新的客戶端連接
  116.                                          my $client = $server->accept();
  117.                 $read_handles->add($client);
  118.               }else{
  119.                               #server被關(guān)閉了
  120.                               stopServer();
  121.                               last;
  122.               }
  123.                          }else{
  124.          $msg = <$fd>;           
  125.          if($msg){
  126.                  #獲取輸入并轉(zhuǎn)小寫
  127.                                   $enter_str = lc($msg);
  128.                                         #去掉回車
  129.                                         chomp $enter_str;
  130.                                         # 判斷是否退出
  131.                                   if($enter_str eq "quit"){
  132.                                           logs("server quit");
  133.                                     stopServer();
  134.                                   }
  135.                  $fd->print($msg);
  136.          }else{
  137.                  # client has finished/closed
  138.                  $read_handles->remove($fd);
  139.                  close $fd;
  140.         }
  141.       }
  142.                 }
  143.         }
  144.         stopServer();
  145. }
復(fù)制代碼
  1. ####################################################
  2. #系統(tǒng)環(huán)境:centos 5
  3. #編譯環(huán)境:perl, v5.8.8 built for i386-linux-thread-multi
  4. #執(zhí)行:     perl 8_client.pl 或者 perl 8_client.pl 127.0.0.1 5555
  5. #題目:
  6. #測試題目8的客戶端,輸入end:退出客戶端;輸入quit:發(fā)quit命令給服務(wù)端并退出客戶端;
  7. #
  8. ####################################################

  9. use IO::Socket::INET;
  10. our $server_ip="127.0.0.1"; #默認(rèn)IP
  11. our $server_port=5555;      #默認(rèn)端口
  12. $msg="Why don't you call me anymore?\n";

  13. #從參數(shù)獲取server的ip
  14. if(isIP($ARGV[0])){
  15.         $server_ip=$ARGV[0];
  16. }
  17. #從參數(shù)獲取端口
  18. if(isPort($ARGV[1])){
  19.         $server_port=$ARGV[1];
  20. }

  21. $socket = IO::Socket::INET->new(PeerAddr =>$server_ip,
  22. PeerPort  => $server_port,
  23. Proto => "tcp",
  24. Type => SOCK_STREAM,
  25. Timeout=>1)
  26. or die "Couldn't connect to $server_ip:$server_port: $!\n";
  27. $socket->autoflush(1);
  28. print "enter something to send to server,enter 'quit' to shutdown server or enter 'end' to quit client\n";

  29. # 通過套接字發(fā)送某些東西,
  30. while(<STDIN>){
  31.         #獲取輸入并轉(zhuǎn)小寫
  32.         $enter_str = lc($_);
  33.         #去掉回車
  34.         chomp $enter_str;
  35.        
  36.         #判斷是否退出
  37.         if($enter_str eq "end" || $enter_str eq "quit" ){
  38.                         #退出客戶端
  39.                         print "exit ok\n";
  40.                         if($enter_str eq "quit"){
  41.                                 $socket->print($_);
  42.                                 print "send ok:$_\n";       
  43.                         }
  44.                         last;
  45.         }
  46.         $socket->print($_);       
  47.         print "send ok:$_\n";
  48.        
  49.         # 讀取遠(yuǎn)端響應(yīng)
  50.         $answer = <$socket>;
  51.         if($answer eq ""){
  52.                 last;
  53.         }
  54.         print "answer:$answer\n";
  55. }
  56. # 然后在結(jié)束之后終止聯(lián)接。
  57. close($socket);

  58. sub isPort{
  59.         my $port=shift(@_);
  60.         if($port=~/d+/){
  61.                 #判斷輸入合法性
  62.                 if($port > 1024){
  63.                         return $port;
  64.                 }
  65.         }       
  66.         return 0;
  67. }

  68. sub isIP {
  69.         my $ip=shift(@_);
  70.         if($ip=~/d{3}\.d{3}\.d{3}\.d{3}/){
  71.                 my @ipn=split(".",$ip);
  72.                 for my $n (@ipn){
  73.                         if($n > 255){
  74.                                 return 0;       
  75.                         }
  76.                 }
  77.         }else{
  78.                 return 0;       
  79.         }
  80.   return 1;
  81. }
復(fù)制代碼

作者: rubylc_unix    時(shí)間: 2011-02-27 09:20
6
  1. #!/usr/bin/perl -w

  2. my $sum = 0;
  3. my $average;
  4. foreach(@ARGV)
  5. {
  6.         $sum += $_;
  7. }
  8. $average = $sum / @ARGV;
  9. foreach(@ARGV)
  10. {
  11.         if($_ > $average)
  12.         {
  13.                 print $_;
  14.                 print "\n";
  15.         }
  16. }

復(fù)制代碼

作者: guap514    時(shí)間: 2011-02-27 09:49
第一題
  1. sub func{
  2.     $x = ...
  3.     $x;
  4. }
復(fù)制代碼
其他的太難不會(huì)
作者: rubylc_unix    時(shí)間: 2011-02-27 10:20
7.
  1. #!/usr/bin/perl -w

  2. my $key = int(1 + rand 100);
  3. print"please input a number\n";
  4. while(my $guess = <STDIN>)
  5. {
  6.         chomp ($guess);
  7.         if( $guess eq "quit" || $guess eq "exit" || $guess =~/\s+/ )
  8.         {
  9.                 exit(1);
  10.         }
  11.         elsif($guess > $key)
  12.         {
  13.                 print "too high,please input again\n";
  14.         }
  15.         elsif($guess < $key)
  16.         {
  17.                 print "too low,please input again\n";
  18.         }
  19.         elsif($guess == $key)
  20.         {
  21.                 print "you got it,bye!\n";
  22.                 exit;
  23.         }
  24. }
復(fù)制代碼

作者: rubylc_unix    時(shí)間: 2011-02-27 10:51
本帖最后由 rubylc_unix 于 2011-02-27 11:00 編輯

5.
  1. #!/usr/bin/perl -w
  2. print for ( system "tree -t");
復(fù)制代碼

作者: lkk2003rty    時(shí)間: 2011-02-27 22:57
本帖最后由 lkk2003rty 于 2011-03-14 15:14 編輯

1. 請(qǐng)正確的精簡如下代碼。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return;
    }
}
  1. sub myfunc{
  2.         $x?1:return;
  3. }
復(fù)制代碼
2. $x=()結(jié)果是什么?列表位于標(biāo)量上下文是什么情況?()是不是用來創(chuàng)建空的list?請(qǐng)解釋原因。
$x是undef
比如$x = (1, 2, 3)會(huì)使x被賦值為列表最后一個(gè)元素3
是的,可以用諸如@x = ();這樣的語句來清空數(shù)組
3. 1,2,3,5,6,7,8 如何合并成1-3,5-8?
  1. #!/usr/bin/perl -w
  2. my @arr = (1, 2, 3, 5, 6, 7, 8);
  3. my $str = shift( @arr );
  4. my $pre = $str;
  5. my $flag = 0;
  6. foreach(@arr)
  7. {       
  8.         if($_ == $pre + 1)
  9.         {
  10.                 $pre = $_;
  11.                 $flag = 1;
  12.                 next;       
  13.         }
  14.         $str .= "-".$pre.",".$_;
  15.         $pre = $_;
  16.         $flag = 0;
  17. }
  18. if($flag == 1)
  19. {
  20.         $str .= "-".$pre;
  21. }
  22. print "$str\n";
復(fù)制代碼
4.@x=(5,7,9); $x[1]與@x[1]的區(qū)別是什么?
$x[1]是數(shù)組x的第二個(gè)元素7,是一個(gè)標(biāo)量
@x[1]是只有數(shù)組x第二元素7著一個(gè)元素的列表,是一個(gè)列表
5. 用最短和優(yōu)的perl代碼對(duì)當(dāng)前目錄下的文件和子目錄按修改時(shí)間進(jìn)行排序。
  1. #!/usr/bin/perl -w
  2. my $dh;
  3. my %files;
  4. opendir($dh,".") or die "Can't opendir \".\":$!";
  5. foreach my $file(readdir $dh) {
  6.         $files{$file} = (stat($file))[9];
  7. }
  8. foreach my $key(sort ascd(keys %files)) {
  9.         print "$key\n";
  10. }

  11. sub ascd {
  12.         $files{$a} <=> $files{$b};
  13. }
復(fù)制代碼
6.傳入一串?dāng)?shù)字并返回所有大于平均值的數(shù)字。
  1. echo "12 23  24 54 64 3 234  3      2" | perl -ane '$ave = 0; foreach(@F){ $ave += $_; } $ave /= @F; @big = grep {$_ > $ave} @F;print "@big";'
復(fù)制代碼
7.讓用戶不斷猜測范圍從1到100的秘密數(shù)字,直到猜中為止。程序應(yīng)該以魔術(shù)公式lnt(1+rand 100)來隨機(jī)產(chǎn)生秘密數(shù)字。當(dāng)用戶猜錯(cuò)時(shí),程序應(yīng)相應(yīng)“too high”或者“too low”。如果用戶quit或者exit或者鍵入一個(gè)空白行程序就中止。當(dāng)然如果用戶猜到了,程序也應(yīng)該中止。
  1. #!/usr/bin/perl -w
  2. use 5.010;
  3. my $num = int (1+rand 100);
  4. print $num."\n";
  5. print "Input your guess number!\n";
  6. while(<>)
  7. {
  8.         given($_)
  9.         {
  10.                 when( /^(quit)?(exit)?\s*\n$/ )
  11.                 {
  12.                         last;
  13.                 }
  14.                 when( /^\s*\d+\s*\n$/ )
  15.                 {
  16.                         chomp;                       
  17.                         if($num < $_)
  18.                         {
  19.                                 print "Too low\n";
  20.                         } elsif($num > $_)
  21.                         {
  22.                                 print "Too high\n";
  23.                         } else {
  24.                                 print "Bingo!U got it!";                       
  25.                         }
  26.                         next;               
  27.                 }
  28.                 print "Error input!\n";       
  29.         }
  30.        
  31. }
復(fù)制代碼
8. 寫一個(gè)簡單的TCP Echo Server,在linux/unix環(huán)境運(yùn)行,偵聽在特定端口,接受用戶的網(wǎng)絡(luò)輸入,并返回同樣的數(shù)據(jù)給對(duì)方,能接受quit命令。
基本要求:
(1)無阻塞IO。
(2)daemon方式運(yùn)行。
(3)能接受kill -HUP重啟信號(hào)。
代碼太長了 傳文件上來吧 測試環(huán)境是 Linux Zealot 2.6.32.11-99.fc12.i686 #1 SMP Mon Apr 5 16:32:08 EDT 2010 i686 i686 i386 GNU/Linux
服務(wù)器端要以root啟動(dòng)。。。
ser.pl是服務(wù)端的代碼
cli.pl是客戶端的代碼
code.rar (2.04 KB, 下載次數(shù): 50)
總算是完成了。。。。
作者: x9x9    時(shí)間: 2011-02-28 11:00
才看到,占個(gè)地方。

1.
  1. sub myfuc {
  2. return unless $x||1;
  3. }
復(fù)制代碼

作者: renxiao2003    時(shí)間: 2011-02-28 11:06
回復(fù) 43# yifangyou


    不愧是Perl強(qiáng)人啊。
作者: x9x9    時(shí)間: 2011-03-01 12:14
第7題:
  1. my $secr=int(1+rand 100);
  2. print "Please enter a number between 1 to 100:\n";

  3. while (<STDIN>){
  4. exit if /^\s*$/ or /^(exit|quit)$/ or $secr==$_;
  5. if ($secr<$_) {
  6. print "too high!\n";
  7. next;
  8. } elsif ($secr>$_){
  9. print "too low!\n";
  10. next;
  11. }
  12. }
復(fù)制代碼

作者: x9x9    時(shí)間: 2011-03-01 12:44
第6題:
  1. print "please enter some numbers:\n";
  2. chomp($_=<STDIN>);
  3. my @arr=split;
  4. my $aver;
  5. my $sum=0;
  6. map {$sum+=$_;$aver=$sum/@arr;} @arr;
  7. my @bignum=grep {$_ if $_>$aver;} @arr;
  8. print join(" ",@bignum),"\n";
復(fù)制代碼

作者: x9x9    時(shí)間: 2011-03-01 13:05
第5題:
  1. opendir my $DIR,"." or die "can't open directary:$!";
  2. my @arr=readdir $DIR;
  3. @arr=sort {-M $a<=>-M $b} @arr;
  4. print join("\n",@arr);
復(fù)制代碼

作者: x9x9    時(shí)間: 2011-03-01 16:24
第3題:
  1. my $str='1,2,3,5,6,7,8';
  2. my @arr=split /,/,$str;
  3. my $temp=0;
  4. my $flag=1;
  5. my %hash;
  6. map {if ($_-$temp==1) {push @{$hash{"$flag"}},$_;} else {$flag++;push @{$hash{"$flag"}},$_;} $temp=$_;}  @arr;
  7. foreach my $k (keys %hash){
  8. $_.=$hash{$k}->[0].'-'.$hash{$k}->[-1].',';
  9. }
  10. chop;
  11. print;
復(fù)制代碼

作者: constmy    時(shí)間: 2011-03-01 19:29

作者: wind_ch    時(shí)間: 2011-03-01 23:12
  1. ### 1題
  2. sub myfunc{
  3.     $x = ...;
  4.     return $x ? 1 : undef;
  5. }

  6. ### 4題
  7. 標(biāo)準(zhǔn)用法和不標(biāo)準(zhǔn)用法的區(qū)別吧

  8. ### 5題
  9. print `ls -t1`;

  10. ### 6題
  11. my @nums = qw(1 3 5 7 -10 0 18);
  12. my @result = grep $_ > eval(join '+', @nums) / ($#nums + 1), @nums;
  13. #print Dumper(\@result);

  14. ### 7題
  15. my $secretNum = int(1 + rand 100);
  16. print "I have a secret number, guess what:\n";
  17. while(<STDIN>){
  18.     exit if(m/^(quit|exit|\s)/i);
  19.     chomp;
  20.     if($_ == $secretNum){
  21.         print "you get it\n";
  22.         exit;
  23.     }
  24.     print $_ > $secretNum ? "too high\n" : "too low\n";
  25. }
復(fù)制代碼

作者: hitsubunnu    時(shí)間: 2011-03-02 12:08
第八題
寫一個(gè)簡單的TCP Echo Server,在linux/unix環(huán)境運(yùn)行,偵聽在特定端口,接受用戶的網(wǎng)絡(luò)輸入,并返回同樣的數(shù)據(jù)給對(duì)方,能接受quit命令。
基本要求:
(1)無阻塞IO。
(2)daemon方式運(yùn)行。
(3)能接受kill -HUP重啟信號(hào)。

Usage: ./s.pl { start | stop | reload | restart | help | version | check }

server: s.pl

  1. use strict;
  2. use warnings;
  3. use Daemon::Generic;

  4. newdaemon(
  5.     progname => 'echoserver',
  6.     pidfile => '/tmp/echoserver.pid',
  7.     );

  8. sub gd_run {
  9. use AnyEvent::Socket;
  10. use AnyEvent::Handle;
  11.         my $cv = AE::cv;

  12.         tcp_server undef, 1234, sub {
  13.                 my $hdl;
  14.                 $hdl = AnyEvent::Handle->new(
  15.                         fh => shift,
  16.                         on_read => sub {
  17.                                 $hdl->push_write("sever:");
  18.                                 $hdl->push_write(delete $hdl->{rbuf});
  19.                         },
  20.                         on_eof => sub {},
  21.                 );
  22.         };
  23.         $cv->recv;
  24. }

  25. sub gd_preconfig{}
復(fù)制代碼
client測試:c.pl

  1. use strict;
  2. use warnings;
  3. use IO::Socket;

  4. my $sock = new IO::Socket::INET (PeerAddr => '127.0.0.1',
  5.                                  PeerPort => 1234,
  6.                                  Proto    => 'tcp');
  7. die "disconnet....$!\n" unless $sock;

  8. print $sock "hello \n";

  9. my $data = <$sock>;
  10. print $data;

  11. exit;
復(fù)制代碼

作者: hitsubunnu    時(shí)間: 2011-03-02 12:27
本帖最后由 hitsubunnu 于 2011-03-02 12:28 編輯

第八題 做成方法2  ## POE

  1. use strict;
  2. use warnings;
  3. use Daemon::Generic;

  4. newdaemon(
  5.     progname => 'echoserver',
  6.     pidfile => '/tmp/echoserver.pid',
  7.     );

  8. sub gd_run {

  9. use POE qw(Component::Server::TCP);

  10. POE::Component::Server::TCP->new(
  11.   Alias       => "echo_server",
  12.   Port        => 1234,
  13.   ClientInput => sub {
  14.     my ($session, $heap, $input) = @_[SESSION, HEAP, ARG0];
  15.     $heap->{client}->put("server:".$input);
  16.   }
  17. );

  18. $poe_kernel->run();

  19. }

  20. sub gd_preconfig{}
復(fù)制代碼

作者: surpass_li    時(shí)間: 2011-03-02 13:25
本帖最后由 surpass_li 于 2011-03-02 13:29 編輯

1. 請(qǐng)正確的精簡如下代碼。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return;
    }
}
答:
sub myfunc {
        return $x and 1;
}
 


6.傳入一串?dāng)?shù)字并返回所有大于平均值的數(shù)字。
sub greThanAver
{
    my ($average,$sum)=(0,0);
    my @gre=();
    foreach(@_)
    {
        $sum+=$_;
    }
    $average =$sum/@_;
   
    foreach(@_)
    {
        if($_>$average)
        {
            push @gre,$_;
        }
    }
   
    return @gre;
}
7.讓用戶不斷猜測范圍從1到100的秘密數(shù)字,直到猜中為止。程序應(yīng)該以魔術(shù)公式lnt(1+rand 100)來隨機(jī)產(chǎn)生秘密數(shù)字。
當(dāng)用戶猜錯(cuò)時(shí),程序應(yīng)相應(yīng)“too high”或者“too low”。如果用戶quit或者exit或者鍵入一個(gè)空白行程序就中止。當(dāng)然如果用戶猜到了,程序也應(yīng)該中止。

#!/usr/bin/perl
use Getopt::Std;
@orig_num;
@guess_num;

sub show_usage() {
        print "Usage: $0 ";
        print "         -p play game ";
        print "         -r Show rules of the game ";
        exit 0;
}

sub show_rules() {
        print "Welcome to This GUESS NUMBER GAME~! ";
        print "====猜測范圍從1到100的秘密數(shù)字====! ";
        print "=輸入quit或exit或鍵入一個(gè)空白行中止=! ";
}

sub generate_rand() {
        my $seed=time();
        srand($seed);
        my $rand = int(1+rand(100));
        $orig_num = $rand;
}

sub get_guess_number() {
        my $num_tmp;
        print "輸入您猜的數(shù)字: ";
        read(STDIN,$num_tmp);
        chomp($num_tmp);
        return $num_tmp;
        print " ";
}

sub check_res() {        
        if($orig_num > $guess_num) {
                return 1;
        }
        if($orig_num < $guess_num) {
                return -1;
        }
        return 0;

}

sub play_game() {
        generate_rand();
        my $i = 0;
        my $num_guess_tmp;
        while(1) {
                $guess_num = get_guess_number();
                if("$guess_num" eq "quit") {
                        exit 0;
                }
                if("$guess_num" eq "exit") {
                        exit 0;
                }
                if("$guess_num" eq " ") {
                        exit 0;
                }
                $result=check_res();
                if("$result" eq "0") {
                        print "中了! ^_^ ";
                        exit 0;
                }
                $result=check_res();
                if("$result" eq "0") {
                        print "中了! ^_^ ";
                        exit 0;
                }
                if("$result" eq "-1") {
                        print "too high";
                }
                if("$result" eq "1") {
                        print "too low";
                }               
        }
}

sub get_opts() {
        getopts(''hrp'');
        if(defined($opt_p)) {
                play_game();
        }
        elsif(not defined($opt_r)) {
                show_usage();
        }
        if(defined($opt_h)) {
                show_usage();
        }

}

get_opts();
作者: wind_ch    時(shí)間: 2011-03-02 16:54
這個(gè)有沒有人想出來只用正則表達(dá)式就可以完成的?
  1. ### 3題
  2. my $string = '1,2,3,5,6,7,8,10,11,12,13,14';
  3. my ($start, $end) = undef;
  4. my $result = '';
  5. while($string =~ m/(\d+)/g){
  6.     ($start = $end = $1) && next unless $start;
  7.     if($1 - $end == 1){
  8.         $end = $1;
  9.         next;
  10.     }else{
  11.         $result .= (($start == $end) ? "$start," : "$start-$end,");
  12.         $start = $end = $1;
  13.     }
  14. }
  15. $result .= "$start-$end";
  16. print "$result\n";
復(fù)制代碼

作者: x9x9    時(shí)間: 2011-03-02 19:11
第2題:結(jié)果是undef。列表位于標(biāo)量上下文返回最后一個(gè)元素。()可以用來創(chuàng)建一個(gè)空列表,也常用來清空一個(gè)列表。

第4題:$x[1]和@x[1]的結(jié)果相同,都是7。前者都知道是數(shù)組中元素的表示方法。但后者這種寫法沒見過,感覺應(yīng)該是之前版本的寫法?
作者: FenRagwort    時(shí)間: 2011-03-02 23:19
#1
  1. sub myfunc {
  2.     # $x = ...;
  3.     $x ? 1 : undef;
  4. }
復(fù)制代碼
#2
1. $x = ()的結(jié)果是undef

2.列表在標(biāo)量上下文返回其中最后一個(gè)變量或直接量在標(biāo)量上下文的返回值。好像很繞口,解釋一下。
主要是列表中若有數(shù)組或哈希作為它的元素的問題,在標(biāo)量上下文,列表中若有數(shù)組或哈希,該數(shù)組或哈希不會(huì)平坦化,而是當(dāng)成單個(gè)的元素。若處在列表最后一個(gè)元素的位置,就返回該數(shù)組或哈希在標(biāo)量上下文的返回值(數(shù)組為元素個(gè)數(shù),哈希為0或3/8這樣的鍵/桶值)
所以@array = qw/a b c/; $s = (1,2,@array);這樣返回的是3(@array的元素個(gè)數(shù)),而不是c。所以嚴(yán)格點(diǎn)說,返回的是最后一個(gè)元素的標(biāo)量值,而不是最后一個(gè)元素。
把列表放到標(biāo)量上下文去通常不是good practice,因?yàn)檫@相當(dāng)于我費(fèi)半天勁寫了前面的元素,最后只要最后一個(gè)元素的標(biāo)量值,如果use warnings了,會(huì)出現(xiàn)void context的警告

3. ()如果是在列表上下文,比如@a = ();那么它就是為了創(chuàng)建空列表或者空哈希%h = ()。如果是在標(biāo)量上下文,不是純粹為了玩兒的話,它的目的應(yīng)該是為了強(qiáng)制給予列表上下文。比如說
  1. @a = qw/a b/;
  2. @b = qw/1 2 3 4/;
  3. @c = qw/d e f/;
  4. $s = (@a, @b, @c);
  5. print $s; # 得到3,即列表最后元素@c在標(biāo)量上下文的值
復(fù)制代碼
如果倒數(shù)第二行改成
  1. $s = () = (@a, @b, @c);
  2. print $s; # 得到9
復(fù)制代碼
中間的()實(shí)際相當(dāng)于給了后面的列表一個(gè)列表上下文,讓它把@a、@b、@c都攤開,賦值給一個(gè)匿名數(shù)組,并立刻將這個(gè)匿名數(shù)組在標(biāo)量上下文的值返回給$s(9就是@a、@b、@c全部元素的值)
另以splice舉例,In list context, returns the elements removed from the array. In scalar context, returns the last element removed.
如果我想得到的既不是移除的元素?cái)?shù)組,也不是最后一個(gè)元素,而是它移除的元素個(gè)數(shù)
笨的方法是先用一個(gè)臨時(shí)數(shù)組接移除的元素,再把這個(gè)臨時(shí)數(shù)組賦值給標(biāo)量
  1. @foo = splice @array, 3;
  2. $count = @foo;
復(fù)制代碼
但實(shí)際只要一行,不用引入新變量即可達(dá)到目的
  1. $count = () = splice @array, 3;
復(fù)制代碼
#3
(1..3,5..

#4
$x[1]是@x的第二個(gè)元素
@x[1]是@x的第二個(gè)元素構(gòu)成的一個(gè)單元素?cái)?shù)組切片

#5
  1. @sorted = sort { -M($a) <=> -M($b) } glob "*";
復(fù)制代碼
#6
  1. $sum += $_ foreach @nums;
  2. $average = $sum / @num;
  3. @above_average = grep {$_ > $average } @nums;
復(fù)制代碼
#7
  1. my $secret_num = int(1 + rand 100);
  2. while (1) {
  3.     print "please input num('quit' or 'exit' to quit): ";
  4.     my $get_num = <STDIN>;
  5.     last if $get_num =~ /quit|exit|^\s*$/i;
  6.     $result = $get_num <=> $secret_num;
  7.     if ($result == 0) {
  8.         print "yes!";
  9.         last;
  10.     }
  11.     elsif ($result == -1) {
  12.         print "too low\n";
  13.     }
  14.     else {
  15.         print "too high\n";
  16.     }
  17. }
復(fù)制代碼
#8
完全不會(huì),沒這需求...
作者: FenRagwort    時(shí)間: 2011-03-02 23:46
第三題會(huì)錯(cuò)意了,重寫
  1. @num = (1,2,3,5,6,7,8,12,14,15,16,17,18,20);
  2. @string = @num;
  3. foreach (0..$#num) {
  4.     if ( ($num[$_] == $num[$_-1]+1) and ($num[$_] == $num[$_+1]-1) ) {
  5.         $string[$_] = "-";
  6.     }
  7. }
  8. $str = join ",", @string;
  9. $str =~ s/,(-,)+/-/g;
  10. print $str;
復(fù)制代碼

作者: chenzq1604    時(shí)間: 2011-03-03 19:22
{:3_191:}好久沒有寫了,生疏了:


  1. 第一題:sub myfunc {
  2.     # $x = ...;

  3.     if ( $x ) {
  4.         return 1;
  5.     } else {
  6.         return;
  7.     }
  8. }
  9. 答:精簡為:
  10. sub myfunc{
  11.     $x?return 1:return;
  12. }


  13. 第二題:
  14. $x=()結(jié)果是什么?列表位于標(biāo)量上下文是什么情況?()是不是用來創(chuàng)建空的list?請(qǐng)解釋原因。
  15. 答:
  16. $x=()設(shè)置為undef,這句可以清空$x中存放的引用值、對(duì)象等等,一般用來釋放
  17. 列表位于標(biāo)量上下文返回是元素個(gè)數(shù)
  18. ()可以用來創(chuàng)建空的list, ((),(),())=()



  19. 第三題:1,2,3,5,6,7,8 如何合并成1-3,5-8?
  20. 答:
  21. my @array=(1,2,3,5,6,7,8);
  22. my $head=shift @array;
  23. my $mid=$head;
  24. my @resume;
  25. while (@array){
  26.     my $x=shift @array;
  27.     if ($x-1==$mid){
  28.          $mid=$x;
  29.      }else{
  30.         push @resume,$head."-".$mid;
  31.         $head=$x;
  32.         $mid=shift @array;
  33.     }
  34.          push @resume,$head."-".$x  unless (@array);
  35. }
  36.   print join(",", @resume);

  37.    
  38. 第四題:@x=(5,7,9); $x[1]與@x[1]的區(qū)別是什么?
  39. 答:
  40. $x[1]是指 @x數(shù)組中第二個(gè)元素,返回是一個(gè)值
  41. @x[1]是包含數(shù)組片段  $x[1]的數(shù)組,返回的是個(gè)數(shù)組



  42. 第五題: 用最短和優(yōu)的perl代碼對(duì)當(dāng)前目錄下的文件和子目錄按修改時(shí)間進(jìn)行排序。

  43. print join "\n", ( sort {(-M $a)<=>(-M $b)} grep{ $_ ne ".."} (glob("*"),glob(".?*")));


  44. 第六題  傳入一串?dāng)?shù)字并返回所有大于平均值的數(shù)字。
  45. 答:
  46. my @k=split ",",shift;
  47. my $resume;
  48. my $n=0;
  49. foreach my $i(@k){
  50.     $n++;
  51.     $resume=$resume+$i;
  52. }
  53. $resume=$resume/$n;
  54. my @rr=grep { $_ >$resume} @k;
  55. print Dumper \@rr;


  56. 第七題:
  57. 答:
  58. my ($k,$i);
  59. print "please input the number:";
  60. while  ($i=<STDIN>){

  61.     chomp $i;
  62.     $k=int(1+rand 100);
  63.     print "the randam is $k \n";
  64.     exit  if ($i eq "quit") or ($i eq "exit") or ($i =~/^\s+$/);
  65.     next  if ($i !~/\d+/);
  66.      $i>$k? print "too high\n": print "too low\n";
  67.     print "right, you are hero~\n";exit if $i== $k;
  68.     next;
  69. }
復(fù)制代碼

作者: chenzq1604    時(shí)間: 2011-03-03 19:22
本帖最后由 chenzq1604 于 2011-03-17 00:52 編輯

第八題


  1. use strict;
  2. use POE qw{
  3. Component::Server::TCP
  4. };

  5. use constant PORT        => 7777;

  6. main();

  7. our %Sessions;

  8. sub main {

  9.    go_daemon();
  10.    start();
  11.    POE::Kernel->run();
  12.    exit(0);
  13. }

  14. sub start {
  15.    POE::Session->create(
  16.        inline_states => {
  17.        start => \&go_start,
  18.        hup_sig => \&go_hup,
  19.        }
  20.    );

  21.    POE::Component::Server::TCP->new(
  22.        Alias              => 'daemon',
  23.        Address            => "localhost",
  24.        Port               => PORT,
  25.        ClientInput        => \&client_input,
  26.        },
  27.    );
  28. }
  29. sub go_hup {
  30.   $_[HEAP]->{stop}='HUP';
  31.   $_[KERNEL]->sig_handled();
  32.    go_stop();
  33.    go_start();
  34. }

  35. sub go_start {
  36.      $_[KERNEL]->alias_set('daemon');
  37.      $_[KERNEL]->sig( HUP => 'sig_HUP');
  38. }


  39. sub go_stop {
  40.    my ($kernel, $heap, $sender) = @_[ KERNEL, HEAP, ARG0 ];
  41.    if ($heap->{stop_client_handler}) {
  42.        $kernel->post($heap->{stop_client_handler}, 'response', 'OK:stop')
  43.          if ref($heap->{stop_client_handler});
  44.        delete $heap->{stop_client_handler};
  45.    } else {
  46.        $heap->{stop_client_handler} = $sender || 1;
  47.        stop_module($kernel);
  48.        $heap->{check_result} = 'stop';
  49.    }
  50. }

  51. sub restart {
  52.    my ($kernel, $heap, $sender) =
  53.      @_[ KERNEL, HEAP, ARG0 ];
  54.    if ($heap->{restart_client_handler}) {
  55.        $kernel->post($heap->{restart_client_handler}, 'response', 'OK:restart')
  56.          if ref($heap->{restart_client_handler});
  57.        delete $heap->{restart_client_handler};
  58.    } else {
  59.        $heap->{restart_client_handler} = $sender || 1;
  60.        stop_module($kernel);
  61.        $heap->{check_result} = 'restart';
  62.    }
  63. }


  64. sub stop_module {
  65.    my $kernel = $_[0];
  66.    for my $s (keys %Sessions) {
  67.        $kernel->signal($s, 'TERM');
  68.    }

  69. }



  70. sub go_daemon {
  71.    my $child = fork;
  72.    die "Can't fork: $!" unless defined($child);
  73.    exit(0) if $child;
  74.    POSIX::setsid();
  75.    open(STDIN,  "</dev/null");
  76.    open(STDOUT, ">/dev/null");
  77.    open(STDERR, '>&STDOUT');
  78.    umask(0);
  79. }


  80. sub client_input {
  81.     my ( $heap, $input ) = @_[ HEAP, ARG0 ];
  82.     $heap->{client}->put($input);
  83.     if ($input eq "quit"){
  84.    $_[KERNEL]->yield("shutdown");
  85.     return;
  86.     }
  87. }

復(fù)制代碼

作者: justlooks    時(shí)間: 2011-03-04 15:24

  1. 第1題
  2. !!x
復(fù)制代碼

作者: ontherd    時(shí)間: 2011-03-08 10:04
perl 第五版白看了,一體都答不上來。
作者: firedtoad    時(shí)間: 2011-03-08 14:59
1

1. 請(qǐng)正確的精簡如下代碼。

sub myfunc {
    $x?$x:'';
}
作者: firedtoad    時(shí)間: 2011-03-08 15:01
2.
undef
作者: firedtoad    時(shí)間: 2011-03-08 15:03
2.
undef
作者: dl0622    時(shí)間: 2011-03-08 16:45
本帖最后由 dl0622 于 2011-03-10 09:12 編輯

以下代碼在AIX5.3試跑通過:

1. 請(qǐng)正確的精簡如下代碼。

sub myfunc {
    # $x = ...;

    if ( $x ) {
        return 1;
    } else {
        return;
    }
}
答:
sub myfunc {
$x==0?"":1;
}

2. $x=()結(jié)果是什么?列表位于標(biāo)量上下文是什么情況?()是不是用來創(chuàng)建空的list?請(qǐng)解釋原因。
答:$x=()結(jié)果是空;列表位于標(biāo)量上下文時(shí)返回最后一個(gè)元素;()是用來創(chuàng)建空的list。
原因:
在標(biāo)量環(huán)境里,列表中逗號(hào)操作符是一個(gè)兩目操作符,它會(huì)丟棄左邊的值并且返回右邊的值。逗號(hào)操作符的左邊實(shí)際上提供了一個(gè)空環(huán)境。
因?yàn)槎禾?hào)操作符是左關(guān)聯(lián)的,如果你有一系列逗號(hào)分隔的數(shù)值,那你總是得到最后一個(gè)數(shù)值,
因?yàn)樽詈笠粋(gè)逗號(hào)會(huì)丟棄任何前面逗號(hào)生成的東西。

3. 1,2,3,5,6,7,8 如何合并成1-3,5-8?
答:
  1. #!/usr/bin/perl

  2. use strict;

  3. my @a=(1,2,3,5,6,7,8);
  4. my @b;

  5. for(0..$#a){
  6.     if(($_==0)||($_==$#a)){
  7.         push @b,$a[$_];
  8.     }
  9.     elsif($a[$_]+1 != $a[$_+1]){
  10.         push @b,(join ",",($a[$_],$a[$_+1]));
  11.     }
  12. }

  13. my $result=join "-",@b;
  14. print $result."\n";
復(fù)制代碼
4.@x=(5,7,9); $x[1]與@x[1]的區(qū)別是什么?
答:$x[1]與@x[1]基本無區(qū)別;$[$a]與@[$a]則有可能存在區(qū)別,例如當(dāng)$a=0..2 時(shí)。


5. 用最短和優(yōu)的perl代碼對(duì)當(dāng)前目錄下的文件和子目錄按修改時(shí)間進(jìn)行排序。
答:
  1. #!/usr/bin/perl

  2. use strict;

  3. opendir(THISDIR, ".") or die $!;
  4. my @allfiles = grep { $_ ne '.' and $_ ne '..' } readdir THISDIR;
  5. my %h;
  6. foreach(@allfiles){
  7.     $h{(stat "./$_")[9]} = $_;
  8. }
  9. foreach(sort keys %h){
  10.     print "$h{$_}\n";
  11. }
復(fù)制代碼
6.傳入一串?dāng)?shù)字并返回所有大于平均值的數(shù)字。
答:
  1. #!/usr/bin/perl

  2. use strict;

  3. my @a=(1,2,3,5,6,7,8);
  4. my $b;

  5. for(0..$#a){
  6.     $b+=$a[$_];
  7. }

  8. my $num=@a;
  9. my $avg=$b/$num;

  10. for(@a){
  11.     if($_>$avg){
  12.         print "$_\n";
  13.     }
  14. }
復(fù)制代碼
7.讓用戶不斷猜測范圍從1到100的秘密數(shù)字,直到猜中為止。程序應(yīng)該以魔術(shù)公式int(1+rand 100)來隨機(jī)產(chǎn)生秘密數(shù)字。
當(dāng)用戶猜錯(cuò)時(shí),程序應(yīng)相應(yīng)“too high”或者“too low”。如果用戶quit或者exit或者鍵入一個(gè)空白行程序就中止。
當(dāng)然如果用戶猜到了,程序也應(yīng)該中止。
答:
  1. #!/usr/bin/perl

  2. use strict;

  3. my $rand_num=int(1+rand 100);
  4. while(1){
  5.         print"please enter a number which is between 1 and 100:\n";
  6.         my $in=<STDIN>;
  7.         if(($in=~/\bquit\b/)||($in=~/\bexit\b/)||($in=~/^\s+/)){
  8.                 exit;
  9.         }
  10.         elsif($in>100||$in<0){
  11.                 print"you enter a number which is not between 1 and 100,please check!\n";
  12.                 next;
  13.         }
  14.         elsif($in > $rand_num){
  15.                 print"too high\n";
  16.                 next;
  17.         }
  18.         elsif($in < $rand_num){
  19.                 print"too low\n";
  20.                 next;
  21.         }
  22.         elsif($in == $rand_num){
  23.                 print"bingo!\n";
  24.                 exit;
  25.         }
  26.         else{
  27.                 print"unknow error!\n";
  28.                 next;
  29.         }
  30. }
復(fù)制代碼
8. 寫一個(gè)簡單的TCP Echo Server,在linux/unix環(huán)境運(yùn)行,偵聽在特定端口,接受用戶的網(wǎng)絡(luò)輸入,并返回同樣的數(shù)據(jù)給對(duì)方,
能接受quit命令。
基本要求:
(1)無阻塞IO。
(2)daemon方式運(yùn)行。
(3)能接受kill -HUP重啟信號(hào)。
作者: Mr-Summer    時(shí)間: 2011-03-08 17:25
好久沒寫perl了,好像不提倡寫for(;;)這種格式的
第一題:
        sub myfunc
        {
                $x?return 1:return;
        }
第二題:
        $x引用的列表首地址,清空該列表
第三題:
        my $i=0,$begin;
        @x=(1,2,3,5,6,7,;
        while($i<$#x+1)
        {
                for($begin=$x[$i];$x[$i]+1==$x[$i+1];$i++){}
                print $begin."-".$x[$i].",";
                $i++;
        }
第四題:
        $x[1]:列表的第二個(gè)元素;
        @x[1]:多重列表內(nèi)第二個(gè)列表元素的首地址(引用);
第五題:
        system(ls -lt .);
第六題:
my $i=0,$sum=0,$agv=0;
if(!@ARGV)
{
        eval (print "error,please input numbers";
}
for(;$i<=$#ARGV+1;$i++)
{
        $sum+=$ARGV[$i];
}
$agv=$sum/($#ARGV+1);
for($i=0;$i<=$#ARGV+1;$i++)
{
        if($ARGV[$i]>$agv)
        {
                print $ARGV[$i].",";
        }
}
作者: isaacblue    時(shí)間: 2011-03-09 16:01
==>>>01 =====================================
sub myfun
{
  #x=...;
  $x?1:undef;
}
作者: isaacblue    時(shí)間: 2011-03-09 16:10
==>>>02 =====================================
1 $x=()結(jié)果是什么?
$x=();的結(jié)果和$x;一樣,都是undef;

2 列表位于標(biāo)量上下文是什么情況?
例如=>$x=(1,2,3);
$x的值為3,()返回列表最后一個(gè)值。

3 ()是不是用來創(chuàng)建空的list?
不是的,這樣的賦值相當(dāng)于未定義。況且還可以定義空散列哩。
作者: isaacblue    時(shí)間: 2011-03-09 16:55
==>>>04 =====================================
#!/bin/perl -w

srand();
$theNum=int(1 + rand(100));
while(1)
{
        print STDOUT "Please input your number : ";
  $myGuess = <STDIN>;
  chomp($myGuess);
  
  if ($myGuess =~/\D{1,}/)
  {
          last if("exit" == "$myGuess" or "quit" == "$myGuess");
          print STDOUT "Not number...\n";
          redo;
  }
  else
  {
          if ($myGuess gt $theNum)
    {
      print STDOUT "too high...\n";
      next;
    }
    elsif ($myGuess lt $theNum)
    {
      print STDOUT "too low...\n";
      next;
    }
    else
    {
      print STDOUT "correct...\n";
      last;
    }
  }
}
作者: vikyleaf    時(shí)間: 2011-03-09 16:58
:wink::wink:加油。!
作者: greenlasting    時(shí)間: 2011-03-14 10:21
學(xué)C的飄過
作者: lxk613    時(shí)間: 2011-03-15 21:33
獎(jiǎng)品比c/c++的豐厚呢,大家趕緊啊,多勞多得,哈哈
作者: 首天    時(shí)間: 2011-03-16 09:22
看代碼學(xué)習(xí)中
作者: fkiori    時(shí)間: 2011-03-16 16:22
今天才看到帖子,晚了點(diǎn)。純屬參與,不求得獎(jiǎng)

1.
sub myfunc{
....
1 if $x
}


2. 結(jié)果是空
有一點(diǎn)點(diǎn)不同時(shí)。perl里面分為匿名數(shù)組和賦值數(shù)組(不知道怎么叫)
$a = (1,2,3,6) 這種叫匿名數(shù)組,標(biāo)量環(huán)境相當(dāng)于逗號(hào)分隔, 取最后一個(gè)值,即 $a = 6
@a = (1,2,3,6) 這種叫賦值數(shù)組, $b = @a 這種在標(biāo)量環(huán)境下,取數(shù)組長度。 即 4

3. 不懂題意。是什么規(guī)則這么合并?
  前三個(gè)數(shù)合并,后4個(gè)數(shù)合并? 假如有第8,9,10個(gè)數(shù)字,那怎么辦?
  還是連續(xù)的數(shù)字合并?
  在題意不明確情況下,有一位朋友的算法最簡單。就是直接賦值。
  $string = "1-3,5-8";

4. 使用過程中沒什么區(qū)別, @a[1] 是Perl5之前的用法。后來改為 $a[1] 這樣,但是現(xiàn)在也兼容這么用。
    嚴(yán)格來說, @a[1] 是一個(gè)數(shù)組的片段(還是數(shù)組),但是只有一個(gè)元素。 $a[1] 是一個(gè)標(biāo)量。

5.
sort {-M $a <=> -M $b}  <*> ;

6.
myfunc(1,2,3,4,5,6,1,8,3,6,1);
sub myfunc{
  my @numbers = @_;
  my $max;
  foreach (@numbers){$max+=$_;}
  foreach (@numbers){push(@result,$_) if ($_>$max/@numbers);}
  return @result;
}

7.

$number = int(1+rand(100));
while (my $input = <STDIN>){
chomp $input;
if ($input =~ /^(exit|quit|)$/){print "Exit\n";exit;}
elsif ($input > $number){print "too high\n";}
elsif ($input < $number){print "too low\n";}
else{print "Got it\n";exit;}

}


8.
這個(gè)是我以前的代碼,少做修改
#!/usr/bin/perl

use strict;
use IO::Socket;
$|=1; # 關(guān)閉輸出緩沖

my %cfg = (
        server_port => 8080,
        client_timeout => 10,
);
my $program_exit = 0;
main();
exit;
##########################
#主程序
##########################
sub main
{
        $SIG{CHLD} = $SIG{INT} = $SIG{TERM} = sub{$program_exit++;};

        #創(chuàng)建Socket監(jiān)聽連接
        my $listen_socket = IO::Socket::INET->new(
                LocalPort       =>"$cfg{server_port}",
                Listen          =>20,
                Proto           =>'TCP',
                Reuse           =>1,
                Timeout         =>$cfg{client_timeout},
        ) or die $!;

        print "程序啟動(dòng),正在監(jiān)聽 $cfg{server_port} 端口 \n";

        #監(jiān)聽
        while (!$program_exit)
        {
                my $connection = $listen_socket->accept;
                next if (!$connection);
                if (fork() == 0){process($connection);}
                close($connection);
        }
        exit 0;

}
sub process
{
        my $connection = shift;
        $connection->autoflush(1);
        my $url;
        while (!$program_exit)
        {
                my $data = $connection->getline();
                chomp $data;
                if ($data =~ /^\s*quit\s*$/){last;}
                print $connection $data."\n";
        }
        $connection->shutdown(2);
}
作者: fkiori    時(shí)間: 2011-03-16 16:23
部分代碼與其他朋友的雷同,甚至一樣。沒辦法
看到題目晚。。。
呵呵
作者: iLRainyday    時(shí)間: 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;
復(fù)制代碼

作者: xiucai315    時(shí)間: 2011-03-16 19:12
回復(fù) 1# 無風(fēng)之谷

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

  4. }
復(fù)制代碼
2.$x=()的結(jié)果是空。1.給一個(gè)標(biāo)量變量,一個(gè)數(shù)組或散列的標(biāo)量元素賦值,在右手邊就會(huì)以標(biāo)
   量環(huán)境計(jì)算
                    2.如果給一個(gè)數(shù)組或者散列,或者它們的片段賦值,在右手邊就會(huì)以列表
                    環(huán)境進(jìn)行計(jì)算,即便是該片段只選出了的一個(gè)元素
                    ()不是用來創(chuàng)建空的list,因?yàn)榭盏?)是處在標(biāo)量環(huán)境。

3.使用范圍操作符"..",1-3為1 .. 3, 5-8為 5 .. 8


4.$x[1]表示數(shù)組@x的第2個(gè)元素7,@x[1]表示二維數(shù)組@x的第0行的第二部分。

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

  8. #取得數(shù)字個(gè)數(shù)
  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. }
復(fù)制代碼
7.
  1. #usr/bin/perl -w
  2. #auth:ly@guess.pl
  3. print"\t let's begin guess magic number!^_^\t\n";
  4. #生成秘?cái)?shù)
  5. $magic_num=int(1+ rand 100);
  6. #猜謎
  7. while(1){
  8. print">guess(1~100):";
  9. $guess=<STDIN>;
  10. chop$guess;
  11. #對(duì)輸入執(zhí)行判斷,是否越界或?qū)儆诿钭址?br />
  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. #猜數(shù)過程
  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.         }
復(fù)制代碼
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. }
復(fù)制代碼

作者: xiucai315    時(shí)間: 2011-03-16 19:23
回復(fù)的晚了,主要是這幾天比較忙,沒有時(shí)間看,趁中午休息時(shí),弄了一下,發(fā)現(xiàn)好多東西還沒看好,像ipc像進(jìn)程處理等等,希望對(duì)我上面的答案給個(gè)建議,謝謝。。。一直以來一個(gè)人用perl,大家都整shell,好孤獨(dú)啊。。
作者: alabos    時(shí)間: 2011-03-16 22:22
第1題:


  1. sub myfunc

  2. {

  3.         #my $x = ...;



  4.         return $x ?  1 :  0;

  5. }

復(fù)制代碼
第2題:



$x=(); 的結(jié)果是:  undef



列表位于標(biāo)量上下文是什么情況? 列表的值依次賦給標(biāo)量。只有列表的最后一個(gè)值會(huì)被保存在變量中。



()是不是用來創(chuàng)建空的list ?  不是, 在上下文環(huán)境中, 它只是一個(gè)標(biāo)量。





第3題:



暫時(shí)空著





第4題:

4.@x=(5,7,9); $x[1]與@x[1]的區(qū)別是什么?



$x[1] 是采用標(biāo)量的形式返回結(jié)果

@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. }



復(fù)制代碼
第6題:

6.傳入一串?dāng)?shù)字并返回所有大于平均值的數(shù)字。


  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. }

復(fù)制代碼
第7題


  1. #!/usr/bin/perl

  2. use strict;

  3. use warnings;



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



  5. while (1)

  6. {

  7.         print "請(qǐng)輸入你猜測的數(shù)并按回車";

  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. }

復(fù)制代碼
第8題,沒有時(shí)間寫了. 呵呵! 下次有機(jī)會(huì)再參加!
作者: brantc    時(shí)間: 2011-03-21 18:02
本來還為錯(cuò)過大賽很遺憾,結(jié)果一看題目一題都不會(huì)。。。
學(xué)習(xí)呀學(xué)習(xí)呀
作者: awk47    時(shí)間: 2011-03-23 12:15
應(yīng)該通過郵箱發(fā)送郵件來參加,這樣直接就貼出來了,很難保證公平,呵呵

---一點(diǎn)小建議
作者: 中不央    時(shí)間: 2011-03-25 18:51
。。。。。。。。。。。。。
作者: 天池怪獸_    時(shí)間: 2011-03-26 14:51
看到了呢
作者: ccl0326    時(shí)間: 2011-03-28 20:58
什么時(shí)候舉辦個(gè)python啊
作者: nizvoo    時(shí)間: 2011-04-01 14:44
好些不會(huì)
作者: suxiaoji    時(shí)間: 2011-04-03 21:33
#!C:\Perl\bin\perl -w
use strict;
my $secret = int (1+rand 100);

print "Your guess: ";

while (my $guess = <>) {

    chomp $guess;

    if ($guess =~ (/[^\d+]|^\s*$|^quit$|^exit$/)) {
           print "You input error or say bye.";
           exit;
          }

    $guess > $secret ? print "Too high. You guess again: " : print "Too low.

Your guess again: ";

      exit if $guess == $secret;
}
作者: fkiori    時(shí)間: 2011-04-20 03:50
對(duì)部分標(biāo)準(zhǔn)答案持懷疑態(tài)度。
作者: qxt912    時(shí)間: 2011-05-06 11:37
mark
作者: y6cmE    時(shí)間: 2011-05-12 22:11
呵呵,好久沒來,錯(cuò)過了。
作者: 南極雨    時(shí)間: 2011-06-03 23:33
sub myfunc {

    # $x = ...;
    $x ?1: ;

}
作者: 午夜凋零    時(shí)間: 2012-03-15 11:54
本帖最后由 午夜凋零 于 2012-03-15 11:55 編輯

第1題:
  1. sub myfunc{
  2.     #my $x = shift;
  3.     return 1 if $x;
  4. }
復(fù)制代碼
第2題:
  1. $x的結(jié)果是空的,相當(dāng)于undef。
  2. 列表位于標(biāo)量上下文中,返回列表最后一個(gè)元素。
  3. ()可以用來創(chuàng)建空的list。
復(fù)制代碼
第3題:
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my @a = (1, 2, 3, 5, 6, 7, 8, 10, 11);
  5. my @b = @a;
  6. my $b = shift @b;
  7. my $c = $b;
  8. my @c;
  9. foreach ( @b ) {
  10.     if ( $_ == $b + 1 ) {
  11.     }
  12.     else {
  13.         push @c, "$c-$b";
  14.         $c = $_;
  15.     }
  16.     $b = $_;
  17. }
  18. push @c, "$c-$b";
  19. print "[@c]\n";
復(fù)制代碼
第4題:
  1. $x[1]是數(shù)組中的一個(gè)元素,@x[1]是一個(gè)數(shù)組,只有一個(gè)元素。
復(fù)制代碼
第5題:
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my %hash = map { -M $_, $_ } glob "*";
  5. print "@hash{sort {$a <=> $b} keys %hash}\n";
復(fù)制代碼
第6題:
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my @a = 1..10;
  5. my @b = &gt_ave(@a);
  6. print "[@b]\n";

  7. sub gt_ave {
  8.     my $sum = 0;
  9.     $sum += $_ for @_;
  10.     return grep { $_ > $sum / @_ } @_;
  11. }
復(fù)制代碼
第7題:
  1. #!/usr/bin/perl
  2. use warnings;
  3. use strict;

  4. my $a = int(1 + rand 4);
  5. while (<>) {
  6.     chomp $_;
  7.     last if ( /^\s*$/ or $_ eq 'exit' or $_ eq 'quit' );
  8.     do { print "Please input a number:\n" and next; } if /\D/;
  9.     do { print "Bingo!\n" and last } if $_==$a;
  10.     do { print "too low!\n" and next } if $_ < $a;
  11.     do { print "too high!\n" and next } if $_ > $a;
  12. }
復(fù)制代碼
第8題:
  1. 這是網(wǎng)絡(luò)方面的嗎?一點(diǎn)也不會(huì),抱歉。
復(fù)制代碼

作者: feilong_36    時(shí)間: 2012-03-17 10:52
我發(fā)現(xiàn)很多人沒有經(jīng)過詳細(xì)測試就把代碼貼出來了,大多數(shù)人可能覺得第一題很簡單,其實(shí)大有文章。
先把我的答案貼出來:
  1. sub myfunc{
  2.         $x?1:undef;
  3. }
復(fù)制代碼
我是主做C語言的,perl水平不高,經(jīng)過詳細(xì)測試后,終于理解到myfunc函數(shù)的返回值只有兩個(gè): 1和undef ,那就應(yīng)該在代碼里明確指出來。
沒時(shí)間仔細(xì)看前面帖子,簡單翻了幾頁,發(fā)現(xiàn)很多人的代碼不會(huì)返回undef,最接近正確答案的是下面這個(gè):
  1. sub myfunc{
  2.         $x?1:return;
  3. }
復(fù)制代碼
我的代碼只是把"return"改成 "undef" ,那個(gè)清晰度立馬就提高了不知多少倍。

非常支持這種比賽,只是希望大家寫代碼時(shí)考慮詳細(xì)點(diǎn),多測試,努力提高代碼質(zhì)量。

作者: feilong_36    時(shí)間: 2012-03-17 10:58
媽的,看錯(cuò)日期了,1年前的帖子!!!!
平時(shí)幾乎不回帖的,難得回一個(gè),居然是挖....
作者: feilong_36    時(shí)間: 2012-03-17 11:15
我錯(cuò)了,
$x?1:undef;是錯(cuò)誤的,賦值給數(shù)組時(shí)有問題,
條款10 如需空數(shù)組,請(qǐng)勿用undef賦值




歡迎光臨 Chinaunix (http://72891.cn/) Powered by Discuz! X3.2