2012-02-08 151 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

相关问题