Re: [問題] 遇到一個問題
可以先釐清各平台上 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
推
07/13 00:40, , 1F
07/13 00:40, 1F
→
07/13 08:13, , 2F
07/13 08:13, 2F
討論串 (同標題文章)
Perl 近期熱門文章
PTT數位生活區 即時熱門文章