来看一道Perl面试题

简介:

据说这道题是QQ的,看下怎么解答为好

题目:

把当前目录下(包含子目录)下所有后缀为.sh的文件后缀变更为.shell(用PERL完成)

一、先人为的制造一些.sh文件

这个用shell吧,方便

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

好,生成文件,OK,部分图

 
  1. [root@test ~]# ll /home/ 
  2. total 404 
  3. drwxr-xr-x 2 root root 4096 Mar  2 09:20 100.sh 
  4. drwxr-xr-x 2 root root 4096 Mar  2 09:20 10.sh 
  5. drwxr-xr-x 2 root root 4096 Mar  2 09:20 11.sh 
  6. drwxr-xr-x 2 root root 4096 Mar  2 09:20 12.sh 
  7. drwxr-xr-x 2 root root 4096 Mar  2 09:20 13.sh 
  8. drwxr-xr-x 2 root root 4096 Mar  2 09:20 14.sh 
  9. drwxr-xr-x 2 root root 4096 Mar  2 09:20 15.sh 
  10. drwxr-xr-x 2 root root 4096 Mar  2 09:20 16.sh 
  11. drwxr-xr-x 2 root root 4096 Mar  2 09:20 17.sh 
  12. drwxr-xr-x 2 root root 4096 Mar  2 09:20 18.sh 
  13. drwxr-xr-x 2 root root 4096 Mar  2 09:20 19.sh 
  14. drwxr-xr-x 2 root root 4096 Mar  2 09:20 1.sh 
  15. drwxr-xr-x 2 root root 4096 Mar  2 09:20 20.sh 
  16. drwxr-xr-x 2 root root 4096 Mar  2 09:20 21.sh 
  17. drwxr-xr-x 2 root root 4096 Mar  2 09:20 22.sh 
  18. drwxr-xr-x 2 root root 4096 Mar  2 09:20 23.sh 
  19. drwxr-xr-x 2 root root 4096 Mar  2 09:20 24.sh 
  20. drwxr-xr-x 2 root root 4096 Mar  2 09:20 25.sh 
  21. drwxr-xr-x 2 root root 4096 Mar  2 09:20 26.sh 
  22. drwxr-xr-x 2 root root 4096 Mar  2 09:20 27.sh 
  23. drwxr-xr-x 2 root root 4096 Mar  2 09:20 28.sh 
  24. drwxr-xr-x 2 root root 4096 Mar  2 09:20 29.sh 
  25. drwxr-xr-x 2 root root 4096 Mar  2 09:20 2.sh 
  26. drwxr-xr-x 2 root root 4096 Mar  2 09:20 30.sh 
  27. drwxr-xr-x 2 root root 4096 Mar  2 09:20 31.sh 
  28. drwxr-xr-x 2 root root 4096 Mar  2 09:20 32.sh 
  29. drwxr-xr-x 2 root root 4096 Mar  2 09:20 33.sh 
  30. drwxr-xr-x 2 root root 4096 Mar  2 09:20 34.sh 
  31. drwxr-xr-x 2 root root 4096 Mar  2 09:20 35.sh 
  32. drwxr-xr-x 2 root root 4096 Mar  2 09:20 36.sh 
  33. drwxr-xr-x 2 root root 4096 Mar  2 09:20 37.sh 
  34. drwxr-xr-x 2 root root 4096 Mar  2 09:20 38.sh 
  35. drwxr-xr-x 2 root root 4096 Mar  2 09:20 39.sh 
  36. drwxr-xr-x 2 root root 4096 Mar  2 09:20 3.sh 
  37. drwxr-xr-x 2 root root 4096 Mar  2 09:20 40.sh 
  38. drwxr-xr-x 2 root root 4096 Mar  2 09:20 41.sh 
  39. drwxr-xr-x 2 root root 4096 Mar  2 09:20 42.sh 
  40. drwxr-xr-x 2 root root 4096 Mar  2 09:20 43.sh 
  41. drwxr-xr-x 2 root root 4096 Mar  2 09:20 44.sh 
  42. drwxr-xr-x 2 root root 4096 Mar  2 09:20 45.sh 
  43. drwxr-xr-x 2 root root 4096 Mar  2 09:20 46.sh 

/home/test下

 
  1. [root@test ~]# ll /home/test/ 
  2. total 0 
  3. -rw-r--r-- 1 root root 0 Mar  2 09:48 testa.sh
  4. -rw-r--r-- 1 root root 0 Mar  2 09:48 testb.sh
  5. -rw-r--r-- 1 root root 0 Mar  2 09:48 testc.sh
  6. -rw-r--r-- 1 root root 0 Mar  2 09:48 testd.sh
  7. -rw-r--r-- 1 root root 0 Mar  2 09:48 teste.sh
  8. -rw-r--r-- 1 root root 0 Mar  2 09:48 testf.sh
  9. -rw-r--r-- 1 root root 0 Mar  2 09:48 testg.sh

写perl 脚本,记得perl有一个模块叫File::Find,可以完成这个效果,试下

code:

 
  1. #!/usr/bin/perl -w 
  2.  
  3. use strict; 
  4. use File::Find; 
  5.  
  6. sub wanted { 
  7.  
  8.     if (-f $File::Find::name) { 
  9.  
  10.         if ($File::Find::name =~ m/\.sh$/) { 
  11.             #print $File::Find::name,"\n"; 
  12.             #print $_,"\n"; 
  13.             #print $File::Find::dir,"\n"; 
  14.             $File::Find::name =~ s/\.sh$/\.shell/g; 
  15.             rename $_,$File::Find::name; 
  16.         } 
  17.  
  18.     } 
  19.  
  20.  
  21. find(\&wanted,'/home'); 

运行一下,测试,大喜,完成,部分图

 
  1. [root@WEB-01 ~]# ll /home/ 
  2. total 4 
  3. -rw-r--r-- 1 root root    0 Mar  2 09:47 100.shell 
  4. -rw-r--r-- 1 root root    0 Mar  2 09:47 10.shell 
  5. -rw-r--r-- 1 root root    0 Mar  2 09:47 11.shell 
  6. -rw-r--r-- 1 root root    0 Mar  2 09:47 12.shell 
  7. -rw-r--r-- 1 root root    0 Mar  2 09:47 13.shell 
  8. -rw-r--r-- 1 root root    0 Mar  2 09:47 14.shell 
  9. -rw-r--r-- 1 root root    0 Mar  2 09:47 15.shell 
  10. -rw-r--r-- 1 root root    0 Mar  2 09:47 16.shell 
  11. -rw-r--r-- 1 root root    0 Mar  2 09:47 17.shell 
  12. -rw-r--r-- 1 root root    0 Mar  2 09:47 18.shell 
  13. -rw-r--r-- 1 root root    0 Mar  2 09:47 19.shell 
  14. -rw-r--r-- 1 root root    0 Mar  2 09:47 1.shell 
  15. -rw-r--r-- 1 root root    0 Mar  2 09:47 20.shell 
  16. -rw-r--r-- 1 root root    0 Mar  2 09:47 21.shell 
  17. -rw-r--r-- 1 root root    0 Mar  2 09:47 22.shell 
  18. -rw-r--r-- 1 root root    0 Mar  2 09:47 23.shell 
  19. -rw-r--r-- 1 root root    0 Mar  2 09:47 24.shell 
  20. -rw-r--r-- 1 root root    0 Mar  2 09:47 25.shell 
  21. -rw-r--r-- 1 root root    0 Mar  2 09:47 26.shell 
  22. -rw-r--r-- 1 root root    0 Mar  2 09:47 27.shell 
  23. -rw-r--r-- 1 root root    0 Mar  2 09:47 28.shell 
  24. -rw-r--r-- 1 root root    0 Mar  2 09:47 29.shell 
  25. -rw-r--r-- 1 root root    0 Mar  2 09:47 2.shell 
  26. -rw-r--r-- 1 root root    0 Mar  2 09:47 30.shell 
  27. -rw-r--r-- 1 root root    0 Mar  2 09:47 31.shell 
  28. -rw-r--r-- 1 root root    0 Mar  2 09:47 32.shell 
  29. -rw-r--r-- 1 root root    0 Mar  2 09:47 33.shell 
  30. -rw-r--r-- 1 root root    0 Mar  2 09:47 34.shell 
  31. -rw-r--r-- 1 root root    0 Mar  2 09:47 35.shell 
  32. -rw-r--r-- 1 root root    0 Mar  2 09:47 36.shell 
  33. -rw-r--r-- 1 root root    0 Mar  2 09:47 37.shell 
  34. -rw-r--r-- 1 root root    0 Mar  2 09:47 38.shell 
  35. -rw-r--r-- 1 root root    0 Mar  2 09:47 39.shell 

/home/test下

 
  1. [root@WEB-01 ~]# ll /home/test/ 
  2. total 0 
  3. -rw-r--r-- 1 root root 0 Mar  2 09:48 testa.shell 
  4. -rw-r--r-- 1 root root 0 Mar  2 09:48 testb.shell 
  5. -rw-r--r-- 1 root root 0 Mar  2 09:48 testc.shell 
  6. -rw-r--r-- 1 root root 0 Mar  2 09:48 testd.shell 
  7. -rw-r--r-- 1 root root 0 Mar  2 09:48 teste.shell 
  8. -rw-r--r-- 1 root root 0 Mar  2 09:48 testf.shell 
  9. -rw-r--r-- 1 root root 0 Mar  2 09:48 testg.shell 

呵,perl 的File::Find模块有三个特殊的变量

 
  1. $_                 包含目录中的当前文件名 
  2. $File::Find::dir   包含当前目录名 
  3. $File::Find::name  包含$File::Find::dir/$_ 

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



本文转自dongfang_09859 51CTO博客,原文链接:http://blog.51cto.com/hellosa/504161,如需转载请自行联系原作者

相关文章
|
6月前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 5
Perl的面向对象编程涉及匿名哈希表或数组来存储对象属性。类通过`@ISA`数组实现继承,如Employee继承Person。在Employee.pm中声明`@ISA = qw(Person)`。在main.pl中,创建Employee对象并调用方法,显示继承功能。程序输出显示姓名的变化。
66 0
|
6月前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 6
Perl 面向对象编程有两种实现:匿名哈希表和数组方式。教程中展示了基于哈希表的继承示例,Employee 类继承并重写了 Person 类的方法。在Employee中,`new`构造函数被重写,添加了新属性,`getFirstName`被重写,还新增了`setLastName`和`getLastName`方法。在主程序中,创建Employee对象并调用这些方法,显示了方法重写和辅助函数的使用效果。
45 3
|
6月前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 3
Perl的面向对象编程涉及两种实现:匿名哈希表引用和数组引用。对象是类(Perl包)中数据项的引用,方法是接收类名或对象作首参的子程序。
42 3
|
6月前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 1
Perl的面向对象编程涉及两种实现:使用匿名哈希表存储对象属性的引用,或使用数组为每个属性创建行索引。对象是类的实例,类是包含方法的Perl包。方法是接受对象或类名作为首参的子程序。`bless()`函数用于构建对象,将引用与类关联。
30 3
|
6月前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 4
Perl的面向对象涉及两种对象实现:匿名哈希表和数组。对象是类的实例,类是包含方法的Perl包。方法是接收对象引用作为首参的子程序。`bless()`函数用于构造对象。以下是一个Person类的例子,包含`new`构造器、`getFirstName`和`setFirstName`方法。在`employee.pl`脚本中,创建Person对象并演示了方法的使用。输出显示了姓名的设置和获取过程。
42 2
|
6月前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 8
Perl面向对象教程展示了两种实现:通过匿名哈希表或数组存储对象属性。示例中,`MyClass`与子类`MySubClass`被定义,后者继承并扩展了父类方法。在主程序中,创建并调用了对象,演示了构造、方法调用、继承及自动调用析构函数的过程。
50 1
|
6月前
|
存储 Java 索引
Perl 教程 之 Perl 面向对象 7
在Perl OOP中,对象基于匿名哈希或数组实现,存储实例属性。当调用不存在的方法时,Perl查找AUTOLOAD来动态处理。析构函数DESTROY在对象销毁时自动调用,允许执行清理操作。不能修改传递给DESTROY的只读引用,但可写入对象本身。析构器可调用基类或其他类的DESTROY,但通常不手动调用。对象释放时,其所含对象也会自动销毁。
36 1
|
6月前
|
存储 索引 Perl
Perl 教程 之 Perl 面向对象 2
Perl的面向对象编程涉及两种实现:匿名哈希表引用和数组引用。对象是类数据的引用,类是包含方法的Perl包。方法是接收类名作为首参的子程序。`bless()`函数用于构造对象。类定义为包,提供独立命名空间,文件通常以`.pm`结尾。例如: ```markdown .package Person # 类代码... .end ``` 简而言之,Perl的OOP基于引用,类是包,方法是子程序,`bless`构造对象,类定义创建命名空间。
34 2
|
6月前
|
存储 索引 Perl
|
6月前
|
存储 索引 Perl