Perl大杂烩

Perl执行Windows命令

Perl执行Windows命令一般有三种方式:

1. system

示例: system "notepad.exe hello.txt"

2.
示例:notepad hello.txt

3. system 1

示例:system 1, "notepad hello.txt"

4. exec

示例:exec "notepad.exe hello.txt" unless fork

总结

  1. system和反引号阻塞线程,其他俩不阻塞
  2. 他们都可以执行复杂命令,比如start notepad && start notepad
  3. perl执行命令收环境变量的影响,比如IDE中设置的环境变量可能影响运行结果
  4. 使用system命令执行后台程序,可以使用startstart notepad.exe

Perl开发TK应用

Perl几乎不需要安装,各个linux里应该都有,MinGW、Cygwin里也有。但是我的MinGW和Cygwin都不能通过cpan -i Tk安装上Tk,报缺crypt.h错误,找不到解决方案。于是下了个Strawberry Perl,照样用cpan命令装不上。只好手动安装。

安装步骤

  1. perl/binc/bin放到环境变量PATH
  2. 到cpan仓库下载Tk源码
  3. 解压到perl/lib目录
  4. 进入perl/lib/Tk-804.034目录
  5. 执行perl Makefile.PL
  6. 执行gmake test
  7. 执行gmake install

hello.pl

1
2
3
4
5
6
7
8
9
10
11
use warnings FATAL => 'all';
use Tk;
use strict;

my $wnd = Tk::MainWindow->new;
$wnd->geometry("600x400");
$wnd->title("Hello Perl && Tk");
$wnd->Label(-text => "Oreo")->pack;
$wnd->Button(-text => "Close", -command => sub {exit})->pack;

MainLoop;

Perl打包TK应用

使用pp打包tkx应用,不能直接运行,提示缺少TCL、Tk相关的库,而且不是直接把缺失的库直接拷贝到同一目录就能用。因此总结一下打包步骤。

  1. pp --compile --noscan --dependent --compress 6 hello.pl
  2. 创建文件夹bin,把生成的exe和需要的dll复制到同一目录
  3. 复制tcl和tk的库到lib目录,lib和bin放同一级目录

打包后的文件结构如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ tree -L 2
.
├── bin
│ ├── hello.exe
│ ├── hello.pl
│ ├── libgcc_s_dw2-1.dll
│ ├── libstdc++-6.dll
│ ├── libwinpthread-1.dll
│ ├── perl526.dll
│ ├── tcl86.dll
│ ├── tk86.dll
│ └── zlib1.dll
└── lib
├── tcl8.6
└── tk8.6

备注:

  1. 这个目录可以用7z压缩到2.7MB左右
  2. 所有目录不能改名,否则运行时找不着依赖。
  3. tk86.dll必须在hello.exe的../bin位置,意味着hello.exe不能放到app根目录。

唐凤PerlYuYan示例

定義數組,遍歷輸出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
use 5.010;
use utf8;
use strict;
use warnings;
use Data::Dumper;
use lib '.';
use Lingua::Sinica::PerlYuYan;
use utf8;
binmode STDOUT, ':utf8';

吾陣飛禽
賦起道燕雀哉
又道鴻鵠哉
又道鴛鴦哉
合兮
印此並列
皆陣飛禽

輸出結果:

1
2
3
燕雀
鴻鵠
鴛鴦

注:

  1. 唐風未翻譯foreach,我暫時把foreach翻譯成了
  2. 字字珠璣,缺一不可