2012-02-08 154 views
0

當我嘗試將字符串中的計算機名與字符串(。)組合使用時,我的Perl程序中出現了問題,請參閱下面的代碼。將兩個字符串與Perl中的點(。)結合起來

#!/usr/bin/perl 
use strict; 
use warnings; 

chomp(my $COMPUTERNAME = `hostname`); #this should give the computername e.g CH-B7G33 
my $complog = $COMPUTERNAME.".log"; 
print "$complog"; 

預期的輸出將是。

CH-B7G33.log 

但我得到的是錯誤的,它打印出來。

.logB7G33 

我在代碼中做錯了什麼?請幫助我,我是一名Perl初學者,並且對我的英語很抱歉。

+2

1)你的例子是無效的Perl。請在第一行的正確位置添加分號。 2)嘗試簡化,直到你能理解,例如在第二行放置'print $ COMPUTERNAME;',看看是否可行。 – Mikel 2012-02-08 06:17:39

+0

感謝您的更正:) – quinekxi 2012-02-08 07:14:14

+0

我面臨同樣的問題,您是如何處理它的? – Atieh 2014-07-18 17:07:09

回答

11

系統調用的返回值在末尾包含\r,其中chomp未清除。因此,您的字符串最終看起來像CH-B7G33\r.log,當打印時導致終端顯示CH-B7G33,然後將光標移回行的開頭,然後顯示.log,它會覆蓋字符,導致您看到不正確的輸出。

使用替代效果很好,並將處理\r\n行尾(以及其他尾隨空格,如此處所述)。

(my $COMPUTER_NAME = `hostname`) =~ s/\s+$//; 
+0

我找到了類似這樣的解決方案。謝謝! :) – quinekxi 2012-02-13 02:27:24

9
use Sys::Hostname; 
print hostname . ".log"; 

有沒有必要chomp或突破到外殼時,有一個很好的庫函數,你想要做什麼。

+0

我已經試過這一個,但在Perl運行在cygwin的另一臺機器上。我不能讓這個運行,我認爲我仍然需要安裝模塊。 – quinekxi 2012-02-08 07:13:45

+2

無需安裝,它是Perl核心發行版的一部分。 '$ corelist Sys ::Hostname␤Sys:: Hostname首次與perl 5一起發佈,# – daxim 2012-02-08 11:06:55

+0

@quinekxi,你在cygwin上看到了什麼症狀?你有錯誤信息,還是會產生混淆或不正確的輸出?如果是這樣,什麼? 'perl -c'是否會在cygwin下產生任何錯誤跟蹤? – 2012-02-08 19:48:08

相關問題