我想为我的同事做一个演示,它将展示Perl可以做的一些令人惊奇的事情,这些事情会让程序员和非程序员都对自己说,"你能做到这一点吗?" 我真的很想转过头来,因为很多人都认为Perl是一种垂死的语言,但也很有趣和有趣.
我的一些想法是以下模块的演示:
Spreadsheet :: WriteExcel和Spreadsheet :: ParseExcel
WWW ::机械化
图片:: Magick
有什么建议或意见吗?
顺便说一句,我们是一家科技公司(运营数据中心),因此我的同事的计算机知识水平很高.
多年前,当我第一次学习如何编程时,我女朋友的堂兄向我展示了他写的Perl脚本,该脚本联系了一个包含所有已知卫星位置的数据库,并计算了最大物体的天桥时间,如空间站米尔.脚本在他运行的服务器上通过cron运行,它将定期运行,然后在给定对象在夜空中可见的前5分钟向他发送一个页面.当我们在城里走动时,他突然指着并说"看!",他可以引起所有人的注意,当卫星在头顶上巡航时,每个人都o and ah ah地说道.
当时我对这个剧本印象非常深刻,因为我不知道如何编写一个几乎复杂的程序.现在我有一个更好的想法,我仍然认为这是一个很好的演示,因为它展示了一些新颖的东西,可以在相对较短的时间内用语言完成,并且没什么汗水.所以我要说一些新颖或有趣的东西,并强调Perl的语言经济性和网络能力.
我相信CPAN本身就相当令人印象深刻.安装新模块的易用性是相当不错的,因为是事实,他们都在那里.
然后组合模块来做很酷的事情:从几乎任何经过的数据生成RSS(或Atom),使用GraphViz ::*生成漂亮的图片(tm).
您还可以查看一些大型框架类型模块的教程,例如Catalyst或POE,它们有一些非常漂亮的东西,你可以用很少的代码做.
如果当地的文化不是太紧张,那么一些Acme ::*模块(例如Acme :: Bleach)非常聪明,肯定会让你大笑.
最后,使用XML :: Twig当然是一个单行程,它可以为您提供美元和欧元之间的当前汇率:
perl -MXML::Twig -l -e'print XML::Twig->parse( "http://www.x-rates.com")->first_elt(q{a[@href="/d/USD/EUR/graph120.html"]})->text'
它很容易适应来自其他网站的废料数据.
向他们展示冰冻泡泡.
向他们展示search.cpan.org(并解释CPAN的概念)后,向他们展示以下任何一项:
驼鹿
DBIx ::类
催化剂
内嵌的Java ::
内联中:C
Inline :: WSC(Windows上的Perl的JavaScript/VBScript)
成像仪
Kamaitachi(使用Moose和Danga :: Socket编写的Perl中的Flash媒体服务器)
然后用一个sort/map/grep组合(又名Schwarzian变换)来打击他们的思想,它在一行代码中比在50行C#中完成更多的工作.
向它们展示线程和分支,然后将它与在Java或C#下完成相同工作所需的相同代码进行比较.
如果他们不被Perl多年来与C#刚才引入的习语相提并论,那么我不知道该说些什么.
屏幕抓取,与外部程序交互以及快速解析文本文件的某种组合会让人印象深刻.squook给出的例子肯定符合要求.
另一方面,为什么不在日常工作中使用它,编写其他人使用的非常有用的工具,并向人们解释你在Perl中制作工具?这样你就可以获得有用的工作,而你工作场所的人肯定会欣赏完成工作的价值.:)
对我来说最酷的事情之一是使用Perl进行代码生成.特别是当它来到其他语言.我编写了几个小脚本来生成C++类和Java代码.
回来的时候我是一个Perl新手.我写了这段代码,它基于我们的数据库生成了模式文件.大约2个小时后,我发现我不需要为DBIx :: Class执行此操作.这不是很好的Perl代码(不要用它来投票给我.这只是一个例子),但它准确地为我生成了200个模式文件.
my @db = `mysql -u XXXXX -pXXXXX --skip-column-names -e "show databases;"`; foreach my $db_name (@db) { chomp($db_name); my @tables = `mysql -u XXXXX -pXXXXX --skip-column-names -e "use $db_name; show tables;"`; $_ =~ s/\n// foreach(@tables); unless ( -e "$db_name.pm") { open(DBFILE, '>', "$db_name.pm"); print DBFILE "package mysql::schemes::$db_name;\n"; print DBFILE "use base qw/DBIx::Class::Schema/;\n\n"; print DBFILE '__PACKAGE__->load_classes(qw/' . join(' ', @tables) . "/);\n\n"; print DBFILE "1;"; close(DBFILE); } mkdir $db_name unless ( -d $db_name or -e $db_name ); foreach my $table_name (@tables) { my @columns = `mysql -u XXXX -pXXXX --skip-column-names -e "USE $db_name; desc \\\`$table_name\\\`;"`; $_ =~ s/\n$// foreach(@columns); my (@names, $primary_key); foreach (@columns) { my ($name, $type, $null, $key, $default) = split(/\t/, $_); chomp($default); push(@names, $name); $primary_key = $name if($key ne ''); } unless ( -e "$db_name/$table_name.pm" ) { open(TBFILE, '>', "$db_name/$table_name.pm"); print TBFILE "package mysql::schemes::" . $db_name . "::" . $table_name . ";\n"; print TBFILE "use base qw/DBIx::Class/;\n\n"; print TBFILE "__PACKAGE__->load_components(qw/PK::Auto Core/);\n"; print TBFILE "__PACKAGE__->table('$table_name');\n"; print TBFILE "__PACKAGE__->add_columns(qw/" . join(' ', @names) . "/;\n"; print TBFILE "__PACKAGE__->set_primary_key('$primary_key');\n\n" unless($primary_key eq ''); print TBFILE "1;"; close(TBFILE); } } }