博客首页 | 排行榜 |

初冬安静的小窝

个人档案
博文分类
Perl 24 小时自学通 转  2009-09-09 14:36

关于perl方面有<<Perl 24 小时自学通>>,马上开始了Perl的学习之旅。有必要将我所学总结一下。中午有事外出,回来继续写.....

(一)开发环境搭建 (Windows + Perl + Eclipse )
  1, 下载并安装Active Perl 5.10,下载链接:http://www.onlinedown.net/soft/8364.htm
          按照提示一直next到安装完成,中间可以改安装路径。
  2, 安装EPIC插件,打开Eclipse --->   software update --> find and install --> search for new features to install ,在new remote site 的URL输入http://e-p-i-c.sourceforge.net/updates/ ,site name输入epic。然后一直确认到安装完成。
   3,安装PadWalker调试工具,切换到命令行提示符下 run-->cmd --> ppm ,弹出图形界面Perl Package Manager。点工具栏第一个按钮View all packages,搜索PadWalker,鼠标右键标记PadWalker 1.9为已安装,然后点工具栏右边倒数第3个Run marked action。程序会自动安装,然后下面的控制台会显示安装完成。如下图:


       经过这样的setup后有一点缺陷,调试的时候watch expression无法显示变量的值,总提示"XXX" (Watch expressions not supported)。
      试过安装LAMP 1.2.2.2,换成低版本的ActivePerl 5.8.8,都是如此,如果谁能够成功解决请告诉小弟一声。
http://blog.csdn.net/Liji0307/archive/2008/01/23/2061412.aspx

(二)新建工程
   环境就搭建好了,新建一个helloworld工程测试,
  File --> new --> Other.. --> Perl --> Perl Project  ,命名为Helloworld。
添加文件 File --> new --> Other.. -->Perl --> Perl File,命名为Helloworld.pl(一定要加后缀名pl,否则程序无法运行)。
Helloworld.pl内容如下:
#!/usr/bin/perl
print "Hello, World!\n";
运行可看到输出结果 Hello, World!

(三)<<Perl语言入门>>是经典的好书,电子版200页的书,没有废话,看上去很重视基础,每看过一页都会有所得,后面的习题很基础,每个问题都涉及都一个点,其实工程也只不过是多个点的组合,下面列出一些题目和本人的解法:


4.3.[18]额外的练习:写一个子程序,名为&above_average,将一列数字作为其参数,返回所有大于平均值的数字(提示:另外写一个子程序来计算平均值,总和除以数字的个数)。利用下面的程序进行测试:
my @fred = &above_average(1..10);
print "\@fred is @fred\n";
print "(Should be 6 7 8 9 10)\n";
my @barney = &above_average(100, 1..10);
print "\@barney is @barney\n";
print "(Should be just 100)\n";

4.3
# !/usr/bin/per -w
sub total
{
   my $sum = 0;
   foreach(@_)
   {
     $sum += $_;
   }
   $sum;
}
sub above_average
{
   my $sum = &total(@_);
   $above = $sum/ @_;
   my @result;
   foreach(@_)
   {
      if($_ > $above)
      {
        push @result,$_;
      }
   }
   @result;
}
my @fred = &above_average(1..10);
print "\@fred is @fred\n";
print "(Should be 6 7 8 9 10)\n";
my @barney = &above_average(100,1..10);
print "\@barney is @barney\n";
print "(Should be just 100)\n";


5.1.[7] 写一个程序,类似于cat,但保持输出的顺序关系。(某些系统的名字可能是tac。)如果运行此程序:./tac fred barneybetty, 输出将是文件betty 的内容,从最后一行到第一行,然后是barney, 最后是fred, 同样是从最后一行到第一行。(注意使用./确保调用的是你自己的程序,而非系统提供的)
5.2.[8]写一个程序,要求用户在不同的行中输入一些字符串,将此字符串打印出来,规则是:每一条占20 个字符宽度,右对齐。为了确保正确的输出,在开头打印出一串数字作为比较(帮助调试)。注意,不要犯19 个字符宽度的错误。例如,如果输入,hello, good-bye,则输出为:
123456789012345678901234567890123456789012345678901234567890
                                     hello
                             good-bye
5.3.[8]修改上一个程序,允许用户选择宽度,如,用户输入30,hello, good-bye(在不同的行中),则每一行的宽度为30。(提示:参阅第二章相应部分)。提示,如果选择的宽度太长,可以增加比较行的长度。

5.1
#! usr/local/perl -w
@ARGV = qw (fred barney betty);
@input = <>;
print reverse @input;

5.2 - 5.3
#! usr/local/perl -w
foreach(1..6)
{
  print 1..9,0;
}
print "\n";
chomp($s = <>);
++$s;
@lines = <>;
foreach(@lines)
{
  printf "%".$s."s",$_;
}


6.1.[7]写一个程序,提示用户输入given name(名),并给出其对应的family name(姓)。使用你知道的人名,或者表6-1
(如果你在计算机上花了太多时间,以致什么人都不认识):
表6-1 样本数据
输入输出
fred flintstone
barney rubble
wilma flintstone
6.2.[15]写一个程序,读入一串单词(一个单词一行)◆,输出每一个单词出现的次数。(提示:如果某个作为数字使用值是
undefined 的,会自动将它转换为0。)如果输入单词为fred, barney, dino, wilma, fred(在不同行中),则输出的fred 将为............(省略)
6.3.  作为额外的练习,可以将输出的单词按照ASCII 排序。

6.1
#! usr/local/perl -w
%names = (
fred => "flintstone",
barney => "rubble",
wilma => "flintstone"
);
while(chomp($name = <>))
{
    print "$name => $names{$name}","\n";
}

6.2-6.3
#! usr/local/perl -w
chomp(@words = <>);
foreach (@words)
{
    $hash{$_} ++;
}
foreach (sort (keys %hash))
{
      print "$_ => $hash{$_}","\n";
}

7.1. [10]写一个程序,输出所有提到fred 的行(不要输出其它行)。如果输入字符串Fred, fredrick, Alfred,能匹配上吗?准
备一个小的文本文件,其中包含如:“fred lintsotne”以及类似的信息。使用这个文本文件作为此程序的输入,以及本节
下面练习的输入。
7.2. [6]修改上面的程序,允许匹配Fred。现在它能匹配,Fred, fredrick, Alfred 吗?(将这些名字加入输入文件中)
7.3. [6]写一个程序,输出出现句号(.)的行,忽略其它行。使用前面练习中的文件进行练习:它能找到Mr. Slate 吗?
7.4. [8]写一个程序,输出有一个字母大写,而非所有字母都大写的行。它能匹配Fred,而不匹配fred 和FRED 吗?
7.5. [8]额外的练习:写一个程序,它能输出所有同时提到wilma 和fred 的行。

7.1-7.5
#! usr/local/perl -w
@ARGV = qw (text);
@lines = <>;
print @lines;
#1
foreach (@lines)
{
   if(/fred/)
   {
     print;
   }
}
print "\n";
#2
foreach (@lines)
{
    if(/(f|F)red/)
    {
      print;
    }
}
#3
print "\n";
foreach (@lines)
{
    if(/\./)
    {
      print;
    }
}
#4
print "\n";
foreach (@lines)
{
    if(/[A-Z]/ && /[a-z]/)
    {
      print;
    }
}
#5
print "\n";
foreach (@lines)
{
    if(/wilma/ && /fred/)
    {
      print;
    }
}

8.1. [8]使用模式测试程序。创造一个模式能匹配字符串match。使用字符串beforematchafter 进行测试。输出结果将其三部
分放在正确位置了吗?
8.2. [7]使用模式测试程序,创造一个模式能匹配任何单词(\w 意义下的单词),但这个单词必需以字母a 结尾。它匹配wilma
而没匹配barney 吗?它匹配Mrs. Wilma Flintstone 吗? wilma&fred 呢?使用前一章习题的文件进行练习(如果没有上
述字符串,则加上它们)
8.3. [5]修改第二题的程序,使之将由a 结尾的单词放到$1 之中。同时修改源代码,使此变量对应的值被放在单引号之中,
如$1 contains ‘Wilma’。
8.4. [5]额外练习:修改第三题程序,使之能捕捉由a 结尾的单词之后的5 个字符(如果有那么多),并将之放入一个独立
变量中。例如,如果输入的是I saw Wilma yesterday, 则紧接的5 个字符是yest(前有空格)。如果输入是I, Wilma!,
则只有一个字符。它现在还能匹配wilma 吗?
8.5. [5]写一个程序(不是测试程序),能输出任何由空白结尾的输入行(非换行符)。在输出的结尾处放置一个标记符,使
之能标记出空白。

8.1-8.2

#! usr/local/perl -w
测试程序如下:
   while(<>)
   {
     chomp;
     if(/your pattern/)
     {
       print "Matched:|$`<$&>$'|\n";
     }
     else
     {
       print "no match:|$_|\n";
     }
   }

8.1题,在命令行输入beforematchafter 回车
替换your pattern为match

8.2题结构如下:
@ARGV = qw{text};
测试程序;
并替换your pattern为\w*a\b
8.3
#! usr/local/perl -w
@ARGV = qw{text};
   while(<>)
   {
     chomp;
     if(/(\w*a\b)/)
     {
       print "Matched:|$`<$&>$'|".' $1 contains'."'$1'\n";
     }
     else
     {
       print "no match:|$_|\n";
     }
}

8.4 匹配以a结尾的word,并将后5个字符放在$1中。
#! usr/local/perl -w
@ARGV = qw{text};
   while(<>)
   {
     chomp;
     if(/\w*a([^\w].{0,4})/s)
     {
       print "Matched:|$`<$&>$'|".' $1 contains'."'$1'\n";
     }
     else
     {
       print "no match:|$_|\n";
     }
}

8.5 套用测试程序,替换your pattern为\s$


9.1. [7]写一个模式,它能匹配$what 当前的内容的3 份连续拷贝。也就是说,如果$what 为fred,则此模式能匹配fredfredfred。如果$what 为fred|barney,则此模式能匹配fredfredbarney, barneyfredfred, barneybarneybarney,或者其它的变种。(提示:你应当在程序的顶端设置$what 的值,如my $what = ‘fred|barney’;)
9.2. [12]写一个程序,它可以得到当前文本文件的一个拷贝。在拷贝的文件中,字符串Fred(大小写无关)将被Larry 替换掉。(因此,“Manfred Mann”将变成“ManLarry Mann”.)输入的文件名已经在命令行中指定(不需要询问用户),输出的文件名是对应的输入文件名后面加上.out。
9.3. [8]修改上面程序,使之将Fred 由Wilma 替换,Wilma 由Fred 替换。如果输入的为fred&wilma,则输出为Wilma$Fred。
9.4. [10] 额外练习:写一个程序在你所有的练习的答案前加上下面这样一行:
a) ## Copyright (C) 20XX by Yours Truly将上面一行放在“shebang”行(Perl 程序的第一行,#!/usr/bin/perl(可能随Perl 安装的位置而有所不同,但是指第一行,
译者注))下面。你应当在“源文件”中修改,但请备份文件。假定你可以在命令行中同时输入程序和需要的修改的文件名。
9.5. [15]额外练习:修改第四题程序,如果程序已经有copyright 这一行,则不进行修改。提示:由<>读入的文件名可以在$ARGV 中找到。

9.1
#! usr/local/perl -w
@ARGV = qw{text};
  my $what = 'fred|barney';
  my $pattern = "($what){3}";
   while(<>)
   {
     chomp;
     if(/$pattern/)
     {
      print "Matched:|$`<$&>$'|\n";
     }
     else
     {
       print "no match:|$_|\n";
     }
}
9.2
#! usr/local/perl -w
#fred(大小写无关)被Larry替换,源文件text被修改,输出备份文件text.out
@ARGV = qw{text};
$^I = ".out";
   while(<>)
   {
      s/fred/Larry/gi;
      print;
   }
9.3
#! usr/local/perl -w
#fred(大小写无关)被Wilma替换,wilma(大小写无关)被Fred替换。源文件text被修改,输出备份文件text.out
@ARGV = qw{text};
$^I = ".out";
   $key = "p0u_y`_1y_ad-i~s3kl9_o";
   while(<>)
   {
      s/fred/$key/gi;
      s/wilma/Fred/gi;
      s/$key/Wilma/gi;
      print;
   }

9.4  
#! usr/local/perl -w
@ARGV = qw{text};
$^I = ".out";
   $copyright = "## Copyright (C) 20XX by Yours Truly";
   while(<>)
   {
      s|#!\s+usr/local/perl\s+-w|$&\n$copyright|gi;
      print;
   }

9.5
#只实现了读文件text。如果text没有copyright的行,则修改后写到text.out。否则什么也不做。
#! usr/local/perl -w
open ($handler, "text") || die ("Could not open file");
my $find = 0;
$copyright = "## Copyright (C) 20XX by Yours Truly";
   seek($handler,0,0);
   while(<$handler>)
   {
       if(/##\s+Copyright.*20XX by\s+Yours\s+Truly/)
      {
         $find = 1;
      }
   }
   if($find == 0)
   {
      seek($handler,0,0);
      open(OUTFILE, ">text.out");
      while(<$handler>)
     {
          s|#!\s+usr/local/perl\s+-w|$&\n$copyright|gi;
          print OUTFILE;
     }
      close(OUTFILE);
   }
   close($handler);

(四)后记,<<Perl语言入门>>看了前9章,做了所有的练习。后面没时间看了,这段时间比较忙碌,不能全部精力投入学习了。前面的调试环境用EasyEclipse+EPIC+PadWalker可以奇怪的搭建好。

类别:默认 |
上一篇:TI09销售面试 转 | 下一篇:perl 学习笔记
以下网友评论只代表其个人观点,不代表本网站的观点或立场