天天看點

來看一道Perl面試題

據說這道題是QQ的,看下怎麼解答為好

題目:

把目前目錄下(包含子目錄)下所有字尾為.sh的檔案字尾變更為.shell(用PERL完成)

一、先人為的制造一些.sh檔案

這個用shell吧,友善

for i in `seq 100`;do touch $i.sh;done 

for i in testa testb testc testd teste testf testg;do touch /home/test/$i.sh;done 

好,生成檔案,OK,部分圖

[root@test ~]# ll /home/ 

total 404 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 100.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 10.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 11.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 12.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 13.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 14.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 15.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 16.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 17.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 18.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 19.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 1.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 20.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 21.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 22.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 23.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 24.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 25.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 26.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 27.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 28.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 29.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 2.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 30.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 31.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 32.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 33.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 34.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 35.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 36.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 37.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 38.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 39.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 3.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 40.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 41.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 42.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 43.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 44.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 45.sh 

drwxr-xr-x 2 root root 4096 Mar  2 09:20 46.sh 

/home/test下

[root@test ~]# ll /home/test/ 

total 0 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testa.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testb.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testc.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testd.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 teste.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testf.sh

-rw-r--r-- 1 root root 0 Mar  2 09:48 testg.sh

寫perl 腳本,記得perl有一個子產品叫File::Find,可以完成這個效果,試下

code:

#!/usr/bin/perl -w 

use strict; 

use File::Find; 

sub wanted { 

    if (-f $File::Find::name) { 

        if ($File::Find::name =~ m/\.sh$/) { 

            #print $File::Find::name,"\n"; 

            #print $_,"\n"; 

            #print $File::Find::dir,"\n"; 

            $File::Find::name =~ s/\.sh$/\.shell/g; 

            rename $_,$File::Find::name; 

        } 

    } 

find(\&wanted,'/home'); 

運作一下,測試,大喜,完成,部分圖

[root@WEB-01 ~]# ll /home/ 

total 4 

-rw-r--r-- 1 root root    0 Mar  2 09:47 100.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 10.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 11.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 12.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 13.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 14.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 15.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 16.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 17.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 18.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 19.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 1.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 20.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 21.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 22.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 23.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 24.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 25.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 26.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 27.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 28.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 29.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 2.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 30.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 31.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 32.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 33.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 34.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 35.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 36.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 37.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 38.shell 

-rw-r--r-- 1 root root    0 Mar  2 09:47 39.shell 

[root@WEB-01 ~]# ll /home/test/ 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testa.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testb.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testc.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testd.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 teste.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testf.shell 

-rw-r--r-- 1 root root 0 Mar  2 09:48 testg.shell 

呵,perl 的File::Find子產品有三個特殊的變量

$_                 包含目錄中的目前檔案名 

$File::Find::dir   包含目前目錄名 

$File::Find::name  包含$File::Find::dir/$_ 

其他的功能尚待研究ing.謝謝大家。

本文轉自dongfang_09859 51CTO部落格,原文連結:http://blog.51cto.com/hellosa/504161,如需轉載請自行聯系原作者