驽马十驾

给我智慧,让我知道我真正的利益所在; 给我坚定的意志,让我能够按照智慧的引导行事
随笔 - 10, 文章 - 1, 评论 - 1, 引用 - 0
数据加载中……

最近用perl做小工具的笔记

1、汉字问题:
如用下面小程序,来说明三点。

use Tk;
use Tk::PathEntry;
use Cwd;
use Encode;
use encoding "gbk";  ##这一句消除TK的乱码
$path = cwd();
$mw = MainWindow->new();
$mw->geometry( '300x80' );
$mw->resizable( 0, 0 );
$mw->PathEntry( -textvariable=>\$path )->pack;
$mw->Label( -textvariable=>\$path, -foreground=>'blue' )->pack;
$mw->Button( -text=>'Quit', -command=>
    sub{ check($path);} )->pack;


sub check($)
{
  $s = shift;
  $s = encode('gbk',$s); ####将从输入窗口获取的字串,编码为gbk,否则后续 -e判断失效
  if(-e $s)
  {
     print "exist\n";
     open FILE, "$s" or die "can not open\n";
     my $line;
     while($line=<FILE>)
     {
        print decode('gbk',$line); #####将从文件读取的文本,用gbk解码
     }
     close FILE;
  }
  else
  {
     print "no exist\n";
  }
}
MainLoop;

出现过Wide character in print at 2.pl line 19

utf8编码字串 --(作为字节流)--> perl不知道它是什么编码 ---> decode ('utf8',$s) ---> perl知道他是utf8编码了,并将其转换为对应的unicode(两个字节)来操作(但实际存储的时候仍是utf8编码)

之所以会出现 Wide character in print at 2.pl line 19. 这样的结果,是因为perl知道你输出的变量字符串是utf8编码的多字节字符,你应该通过encode函数将该变量转换成字节流encode('gbk',$s); ,这样perl就不会出现这个警告

综上,可以知道,perl对待外来的数据一律当作字节流处理,通过 decode 函数可以告诉 perl 当前字节流是什么编码,这时 perl 就会把他按照原来对应的编码方式内部解码为 unicode 来操作(此时这串字节流已经被perl当作是有一定意义的unicode字符串来理解了),当你要将操作完的字符串输出的时候,应该将其用encode函数按照相应的编码方式打包成字节流再输出.

2、创建一个新进程:
use Win32::Process;
use Win32;


my $isAgent = $ARGV[0];
print $isAgent;
sub ErrorReport{
  print Win32::FormatMessage( Win32::GetLastError() );
}

if(defined($isAgent))
{
  print "i am agent \n";
  exit(0);
}
else
{
  #Win32::Process::Create($ProcessObj,"notepad.exe", "notepad", 0,DETACHED_PROCESS, ".")
  Win32::Process::Create($ProcessObj,"C:\\Perl\\bin\\perl.exe", "perl process.pl yu", 0,DETACHED_PROCESS, ".")
    || die ErrorReport();
  print "perl process has started\n";
  print "The exit code is:",$ProcessObj->GetExitCode($ExitCode),"\n";
}

3、进程间通讯:
使用Win32::MMF和Win32::MMF::shareable简单方便,之前使用Open2效果很不好。

posted on 2009-01-07 23:01 驽马 阅读(583) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。