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效果很不好。