免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3355 | 回复: 4
打印 上一主题 下一主题

[解决,原理不明]为什么主函数输出正常,子函数输出就not map to cp936 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-12-23 13:54 |只看该作者 |倒序浏览
本帖最后由 死水站 于 2015-01-05 09:33 编辑

事情是这样的:

自从用了神一般的use open ":encoding(gbk)", ":std";再没遇到什么大问题 (.pl是utf8写的,需要读取的文本和控制台都是gbk)

结果昨天发现,主函数调用子函数,子函数传回的$,在主函数中可以say,可以>进文件,都是正常文字;但是在子函数中say那些$时,就显示\{XXXX} not map to cp936,子函数中也有那句use open ":encoding(gbk)", ":std";啊,该加的都加了,咋回事?

另外,发现子函数中不能写入文件?给我提示“Can't use string ("TXT2") as a symbol ref while "strict refs"”,(TXT2是句柄名字)。

哪位知道,给解答下?

=================自问自答

花了一个晚上测试,终于发现原因,

针对主程序调用子程序,放在不同的.pl里,只要主函数加上use open ":encoding(gbk)", ":std";即可,子函数say一个含中文字串的变量将正常显示;但是,要say到一个.txt时,需要加上encode(),写成“say $句柄 encode("gbk", $输出变量);”,这样输出文件也正常。

第二个问题,zhlong8 已经回答过,用 my $句柄的形式好过一个大写常量

记录报告写了两张纸,测试了不同情况,太多就不打上来了。

论坛徽章:
46
15-16赛季CBA联赛之四川
日期:2018-03-27 11:59:132015年亚洲杯之沙特阿拉伯
日期:2015-04-11 17:31:45天蝎座
日期:2015-03-25 16:56:49双鱼座
日期:2015-03-25 16:56:30摩羯座
日期:2015-03-25 16:56:09巳蛇
日期:2015-03-25 16:55:30卯兔
日期:2015-03-25 16:54:29子鼠
日期:2015-03-25 16:53:59申猴
日期:2015-03-25 16:53:29寅虎
日期:2015-03-25 16:52:29羊年新春福章
日期:2015-03-25 16:51:212015亚冠之布里斯班狮吼
日期:2015-07-13 10:44:56
2 [报告]
发表于 2014-12-24 09:35 |只看该作者
not map to cp936 这个应该是你用了超出 GBK 的字符

第二个是常见错误,借你要把代码贴出来才知道怎么错了啊。推荐永远用3参数的open,用变量而不要用这些bareword当句柄,open my $fh, '<', 'blablabla' or die $!;

论坛徽章:
0
3 [报告]
发表于 2014-12-25 20:38 |只看该作者
主函数开头是这样,

#! perl
#TxtProcess.pl

use 5.012;
use utf8;
use autodie;
use open ":encoding(gbk)", ":std";

unshift (@INC, "./sub");
require "ChoiceQ_PROCESS.pl";
require "TorFQ_PROCESS.pl";
require "BlankF_PROCESS.pl";

下面就是打开读取文本和调用子函数了。在这个里面随便say到屏幕还是say到.txt都正常。

子函数放在.\sub\下面,开头是这样
#! perl

use 5.012;
use utf8;
use autodie;
use open ":encoding(gbk)", ":std";

其实就是一样啦,呵呵。在这个子函数里,say到屏幕就是那个not map to cp936云云。

你说的用变量做句柄,我看下怎么用,到时尝试下。

回复 2# zhlong8


   

论坛徽章:
0
4 [报告]
发表于 2014-12-25 20:54 |只看该作者
另外想问下啊,encode decode神马的搞不清楚,因为有

use XXX
use open XXX,以及什么i/o层,“std”
encode/decode
encoding/decoding
以及encode模块

等等各种写法,我知道有的是不同版本perl造成的

哪里能系统学习一下这些呢?难道只有perldoc的英文?有点怕英文,呵呵

回复 2# zhlong8

  

论坛徽章:
0
5 [报告]
发表于 2014-12-29 15:05 |只看该作者
版主啊,回去试过了,用变量做句柄输出是输出了,文件内容也正确,但是显示

Wide character in print at ./sub/BlankF_PROCESS-c.pl line 110.

然后看了仔细看着个.txt,发现正常主函数输出时都是gbk编码,这个子函数输出的.txt是utf-8无BOM编码,虽然字符神马的都没问题,但是还是不对吧?

我主函数和子函数开头都加的这段
use 5.012;
use utf8;
use autodie;
use open ":encoding(gbk)", ":std";

麻烦帮我看看哈

回复 2# zhlong8


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP