2017-08-25 43 views
0

我可能錯過了某些東西,因爲我今天開始使用Perl,所以請原諒,如果它是非常明顯的東西。Perl從文件加載時錯誤地分割字符串

我想從文件中加載字符串,然後逐字符地分割它。 我做了以下

use strict;  
open my $fh, "<", "hello.txt" || die "Cannot open file!\n"; 

my $data = do { local $/ ; <$fh>}; 
print $data; 

print join(', ',(split(//, $data))); 

close $fh; 

當我執行這個腳本的第一個打印語句打印$的數據沒有問題,但是第二打印僅打印加入字符串。

Hello, world! 
, 

我的Windows 7機器草莓的Perl上運行,我沒有在目前訪問的Unix/Linux機器,所以我不能在其他地方進行測試。

+0

提示:由於您讀取了塊內的文件,因此也在此處打開它。這很好地包含(範圍)'$ fh'到該塊,並將所有相關代碼放在一起。所以,'我的$ data = do {local $ /;打開我的$ fh ...; <$fh>};'當代碼退出塊並且'$ fh'不再存在時,文件_is_關閉。 – zdim

+0

稍微偏離主題,但可以使用VMware Player和Ubuntu映像運行Linux,而在Windows中運行Linux。 –

+0

我會,但我現在有點懶惰設置:)。 –

回答

5

這可能是回車字符"\r"的一個問題 - Windows行末尾是\r\n,而\r自己移回到行首,覆蓋已寫入的內容。

您可以chomp $data先刪除行結尾,雖然這隻會刪除最後一行結尾。

你也可以有Perl讀取文件時,通過應用:crlf IO層在Windows \r\n行尾轉換爲Unix \n行結尾:

open my $fh, "<:crlf", "hello.txt" or die "Cannot open file!\n"; 

(請注意,它必須是open … or die …open(…) || die …但而不是open … || die …,這是因爲運算符優先級規則。)

+0

:crlf不會改變任何問題持續存在。 –

+0

哦對不起,它的工作謝謝你:); –