Perl 板


LINE

試一下下面的 code,就可以看出 $/ ($INPUT_RECORD_SEPARATOR) 對於 換行的影響,也就是逐行讀入的差別所在。如果要讀的檔案不確定是用 何種換行符號,或是都存在各種換行符號,那麼可以考慮用 slurp mode 都讀進來後再處理。這個問題也很常見於寫一些網路應用程式,建議可以 參考 Net::Cmd 模組 getline() 函式。 my @buf = split(/\015?\012/, $buf, -1); ## break into lines ================================================================= #!/usr/bin/perl use strict; use warnings; my $data = "111\n222\n\r333\r\n444\r555"; my %IRS = ( ord("\n") => '\n', ord("\r") => '\r', ); sub get_chr_list { my ($irs) = @_; return join( "", map( $IRS{ ord($_) }, split( //, $irs ) ) ); } sub load_file { my ( $filename, $irs ) = @_; $irs = defined($irs) ? $irs : ""; printf( "Current INPUT_RECORD_SEPARATOR = %s\n", get_chr_list($irs) ); do { local $/ = $irs; open( FH, "$filename" ); while (<FH>) { chomp; $_ =~ s/\n/\\n/g; $_ =~ s/\r/\\r/g; print "[$_]\n"; } close(FH); } } sub main { open( FH, ">/tmp/test.txt" ); print FH $data; close(FH); printf( "Default INPUT_RECORD_SEPARATOR = %s\n", get_chr_list($/) ); load_file( "/tmp/test.txt", "\n" ); load_file( "/tmp/test.txt", "\n\r" ); load_file( "/tmp/test.txt", "\r\n" ); load_file( "/tmp/test.txt", undef ); # slurp } main; ※ 引述《abliou (把青春freeze)》之銘言: : ※ 引述《StarTouching (撫星)》之銘言: : : 找到原因了.... : : 首先要先知道 : : Windows的 command-line(亦即DOS) 按Enter時會送出\r\n : : 但是在txt中, 只有\n (也許整個非Dos環境都是如此) : : chomp預設只會篩掉\n, : : 所以如果從STDIN讀入(DOS輸入), : : 就會仍遺留下\r : : 改$/ = "\r\n" : : 可讓chomp篩掉\r\n : : 但$/也影響到Perl讀取字串的斷點 : : 所以txt檔裡面只有\n 沒有\r, : : 那Perl就找不到斷點, : : 應該要把$/改回"\n" : : 結論: 在Windows 需要DOS輸入時, 才需要改 $/ : : 不過這狀況其實不常用在實際應用, : : 多半在練習或debug才會用, : : 但正是因為如此, 初學者才更容易遇到這個問題而不知解決方法 : 看到這邊就想到大約兩年前的討論串 不過往上爬文已經找不到了 : 有一種方法叫做slurp 作法就是把$/設為undef : 這樣在讀檔就會略過換行符號 把整個檔的內容放到字串中 : 這種方法用在網頁的tag處理很有用 : 因為在擷取網頁資料時都是在擷取兩個tag中間的資訊 : 所以無形中換行符號就變成一種問題 : (當然在常規表示式中會有解決方案) : Perl中很多預設變數 在更改都會有用處跟用意 不過也要注意後面的影響 : ps.我承認我蠻菜的 不過目前我用過的perl 都還沒碰過原po碰到的問題 --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.114.64.130
1F:推 abliou:推阿 03/21 21:34







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Soft_Job站內搜尋

TOP