作者liyih ()
看板Perl
标题Re: [问题] 遇到一个问题
时间Tue Jul 6 15:26:25 2010
可以先厘清各平台上 input record separator 的差异:
1. UNIX => LF ( Line feed、\n、\x0A )
2. DOS => CR + LF ( \r\n )
3. Mac OS => CR ( Carriage return、\r、\x0D )
使用 Data::Dump 来看看现在的 input record separator 是什麽?
print Data::Dump->dump($/);
另外 while (<FH>) 依据 $/ 来判断分行读入资料,而 chomp() 则是剔除 $/。
==== 以下测试自动侦测 input record separator ====
use Data::Dump;
my $in_file = '1.txt';
open( FH, $in_file ) or die "open file error";
$/ = undef;
my $data = <FH>;
close(FH);
$/ = $1 if $data =~ m/([\n\r]+)/;
print Data::Dump->dump($/), "\n";
foreach ( split( $/, $data ) ) {
print $_, "_PAD", "\n";
}
=================================================
如果您的输入资料大致上只有 CR+LF 或是 LF,那用 s/[\r\n]+$// 应该就够,
或是读入第一行时去侦测 CR+LF 还是 LF,再修改 $/ 变数,并用 chomp() 移除换行。
while (<FH>) {
$/ = $1 if (m/([\r\n]+)$/);
chomp;
print $_, "_PAD", "\n";
}
参考:
http://www.kichwa.com/quik_ref/spec_variables.html
http://en.wikipedia.org/wiki/Delimiter
http://en.wikipedia.org/wiki/Line_feed
http://en.wikipedia.org/wiki/Carriage_return
※ 引述《oldstyle (lucky)》之铭言:
: 我是在工作站上发现这个问题的
: 本来有一些资料我从excel剪贴到txt 再用ftp传到工作站上去跑
: 结果就发生了这样的问题
: 但是一样的事情我在pc上面执行同一支程式 却是ok的
: 後来我在工作站上 手key了一份一模一样的档案来当input file
: 结果就成功了@@
: 所以在猜应该是编码的问题
: 但是我也不太清楚就是了
: 希望有高手能帮忙解答
: 感激不尽.... >_<
: ※ 引述《oldstyle (lucky)》之铭言:
: : 想请教一下 遇到以下的状况该怎麽解决?
: : 我有一个档案 想要在每一行的字串最後全部加上"_PAD"
: : 本来我是这样做的
: : =================================================
: : #! /usr/local/bin/perl -w
: : use strict;
: : open (file,$in_file) or die "open file error";
: : foreach (<file>) {
: : chomp;
: : $_ = $_."_PAD";
: : print "$_\n";
: : }
: : close(file);
: : =================================================
: : 本来结果应该是
: : ABCDE --> ABCDE_PAD
: : FGHIJ --> FGHIJ_PAD
: : 但我却变成
: : ABCDE --> _PADE
: : FGHIJ --> _PADJ
: : 请问是哪边出了问题呢??
: : 谢谢各位!!!
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.114.64.133
1F:推 hsnu114444:MacOSX现在是Unix底了,换行符号应该也是\n吧? 07/13 00:40
2F:→ liyih:是的,所以才说是 Mac OS 而不是 Mac OS X 07/13 08:13