`

[perl]Wide character in print报错

    博客分类:
  • perl
阅读更多

原文http://hi.baidu.com/mxp446533129/blog/item/5d9f3812b3e9c414213f2e3b.html

用perl写文本处理程序,或者写服务器端脚本的时候,常常会遇到“Wide character in print” 的警告或者错误。

这是因为在程序中处理中文等宽字符时,perl不能识别要处理的内容。

首先要知道perl只能处理两种编码:ascii码和utf-8。ascii码是很少的,像中文、日文、韩文等字符要想能被perl处理,只能用 utf-8编码方式。字符串在perl内部的存储格式如下图:

当flag是1的时候,perl就会把那个字符串当做utf-8编码的字符来处理;如果是0,perl就不能认知字符串中除了 ascii码之外的字符,这个时候,就会报出“Wide character in print”的警告或者错误。

举个例子,你要在程序中处理‘当历史成为历史’这个字符串,如果你的程序文件是utf-8编码的话,一般情况下直接处理就行了,因为这 时字符串的utf8-flag是打开的。如果你的程序文件是gb2312的话,那么你就需要把那个字符串的utf8-flag打开。但是,一般还会有这样 的问题,因为这个字符串是gb2312编码的,所以你要做两件事情:将字符串的编码转为utf-8和打开utf8-flag。

use Encode;
use strict;

my $str = "当历史成为历史";
Encode::_utf8_on($str);
print $str. "\n";
Encode::_utf8_off($str);
print $str. "\n";
将上面的这段程序存到文件里,试图运行的时候就会报错:Wide character in print at test.pl line 6。这就是因为utf8-flag被关闭,perl不能识别字符串。

当然,在每个处理宽字符的地方加上Encode::_utf8_on函数确实是个解决办法。但是一般来说,在每个地方都加上这样的函 数,既在编写程序的时候麻烦,维护的时候更麻烦。

这里还有一个更好的办法:在程序文件的头部加上以下内容

use utf8;
binmode(STDIN, ':encoding(utf8)');
binmode(STDOUT, ':encoding(utf8)');
binmode(STDERR, ':encoding(utf8)');

分享到:
评论

相关推荐

    解决Can’t locate ExtUtils/MakeMaker.pm in @INC报错

    Can’t locate ExtUtils/MakeMaker.pm in @INC (@INC contains: inc /usr/local/lib64/perl5 /usr/local/share/perl5 /usr/lib64/perl5/vendor_perl /usr/share/perl5/vendor_perl /usr/lib64/perl5

    TCGA临床数据提取_perl提取tcga临床数据,perl读取临床数据报错

    在“perl读取临床数据报错”的描述中,可能遇到的问题有文件读取错误、编码问题、数据格式错误等。解决这些问题通常需要检查文件路径是否正确、数据文件的编码是否与Perl脚本匹配、解析逻辑是否有误等。具体错误信息...

    Teach Yourself Perl In 21 Days

    l Actual Perl code is typeset in a special monospace font. You'll see this font used in listings and the Input-Output examples, as well as in code snippets. In the explanations of Perl features, ...

    解决Can't locate ExtUtils/MakeMaker.pm in @INC报错

    在使用Perl进行软件安装或开发过程中,可能会遇到“Can't locate ExtUtils/MakeMaker.pm in @INC”这样的错误。这个错误表明系统找不到`ExtUtils::MakeMaker`模块,这是一个Perl模块,用于创建Makefile,帮助编译和...

    Thinking in perl(Perl编程思想)

    《Thinking in Perl》是Perl编程领域的一本经典著作,它深入浅出地介绍了Perl语言的精髓和编程思想。这本书不仅适合初学者,也对有经验的程序员提供了宝贵的洞见。以下将从标题、描述和标签中提取的关键信息,详细...

    删除卸载单个perl模块脚本

    1. **检查已安装模块**:使用`cpan -l`或`perl -MCPAN -e 'print join("\n", map { $_->dist } CPAN::Distribution->installed)'`命令查看已安装的Perl模块列表,找到你要卸载的模块名。 2. **确定模块位置**:找到...

    perl处理xml神乎其神

    perl语言作为一种胶水语言已经被业界流传很近,perl的处理文本的能力也是众所周知的,次书,详细描述了多种处理xml文件的包极其大量的范例。

    Teach Yourself Perl 5 in 21 days

    ### 教程:《21天自学Perl 5》 #### 核心知识点概览 在《21天自学Perl 5》这本教程中,读者将系统地学习到Perl 5编程语言的基础知识和高级特性。Perl 5是一种功能强大且灵活的脚本语言,广泛应用于多种场景,如...

    centos7 perl rpm依赖包

    装mysql时提示少perl,安装perl需要依赖包。已包含下面所有包, 版本号匹配。 [Linux]centOS7下RPM安装Perl 下载rpm依赖包,依照顺序安装. perl-parent-0.225-244.el7.noarch perl-...

    Perl-5.10.0版本

    Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0版本,Perl-5.10.0...

    命令行中执行单行Perl脚本

    perl -e 'print "hello world!\n"' ``` 这条命令会在标准输出中打印出“hello world!”。 **-n选项** -n选项使得Perl能够在循环中逐行读取文件,但不会自动输出这些行。这非常适合于处理文本文件时的过滤和搜索操作...

    Learn Perl in 21 days

    This is a super good perl tutorial. It will teach you perl by so many elementory examples and clear explanations. Worth treasuring.

    perl in 21 days

    《Perl in 21 Days》是一本针对初学者的Perl编程入门教程,旨在帮助读者在短时间内掌握这门强大的脚本语言。Perl,全称为“Practical Extraction and Reporting Language”,最初设计用于文本处理,但随着时间的发展...

    Teach_Yourself_Perl_in_21_Days

    ### 教程概览:《21天自学Perl》 #### 一、引言与学习目标 本书《21天自学Perl》旨在帮助读者在较短的时间内掌握Perl编程语言的基础知识及其应用技巧。通过本教程的学习,读者将能够熟悉Perl的基本语法结构、常用...

    Perl开发环境.zip

    创建一个扩展名为`.pl`的文件,写入一些简单的Perl代码,如`print "Hello, Perl!\n";`,然后在命令行中运行`perl your_script.pl`,你应该能看到输出。 Perl语言的核心特性包括: - **灵活性**:Perl的语法灵活...

    Perl语言编程:Programming Perl

    print "<html><body>Hello, Perl!</body></html>"; ``` #### 数据分析 Perl的文本处理能力使其在数据分析领域也有广泛应用: ```perl use Text::CSV; my $csv = Text::CSV->new({ binary => 1 }); open my $fh, ", ...

    用 Perl 实现的有用的单行程序(pdf)

    - `perl -ne 'print unless /^$/'` - `perl -lne 'print if length'` - `perl -ne 'print if /\S/'` - **零分割打印**:在处理特殊格式的文件时,可以使用`-00`参数来分割数据并打印: - `perl -00 -pe ''` - ...

    Sams Teach Yourself Perl in 21 Days

    ### Sams Teach Yourself Perl in 21 Days #### 核心知识点概览: 根据所提供的信息,我们可以提炼出以下几个核心知识点: 1. **Perl语言简介**:本书为读者提供了Perl编程语言的基础入门指导。 2. **字符串与...

    Think in perl

    Think in perl学习perl的参考书,包括大量的实例

    Perl命令行参数

    perl -e 'print "Hello World\n"' ``` 上述命令将直接输出 `Hello World`。 - **多字符串叠加**: ```bash perl -e 'print "Hello";' -e 'print "World\n"' ``` 这样可以连续执行多个命令行指令。 ##### 2....

Global site tag (gtag.js) - Google Analytics