2011-11-04 65 views
1

我正在循环访问数组时附加文件扩展名。例如,期望的输出是ABC001.csv,但输出看起来更像.csv01。Perl附加前缀循环数组

任何帮助如何做到这一点非常感谢。如有必要,我可以提供更多代码。

foreach my $name (@source){ 
print "${name}.csv\n"; 
} 
+2

这应该工作。你确定'@ source'包含你认为它的作用吗?你有没有严格使用?使用警告;'? – Mat

+2

我的猜测是你的文件名后面有回车符。 – ErikR

+0

你可以发布输入'@ source',它至少是它的一部分吗? –

回答

6

我确定您在文件名末尾有回车符。即,$name正在设置为“ABC001 \ r”。当您打印 “$ name.csv \ n”,你得到:

ABC001<- 
.csv 

它看起来像.csv01在屏幕上。

速战速决将去除回车这样的:

for my $name (@source) { 
    $name =~ s/\r//g; 
    print "$name.csv\n"; 
} 

但更好的解决办法是删除在点回车在数据进入你的应用程序。

+0

建议一种解决问题的方法会很有用。 –

+0

谢谢!有用! @ user5402 –

+0

+1用于识别这个奇怪的问题!我从来没有想过... –

1

user5402的回答是正确的。我只是想分享一些Perl特点:

s/\s*$/.csv/, say for @source; 

或者化整为零,以避免可能的冲突:

s/\s*$/.csv/ for @source; 
say for @source; 

sayuse v5.10use feature qw(say)启用了,简直是print附加在一个换行符结束。

替换将用“.csv”替换您的字符串末尾的任何空格 - 包括回车符。如果没有空白,它将只添加“.csv”,因为量词*允许零匹配,并且锚$匹配字符串的末尾。

有点神奇的是$_@source的所有元素的下标循环中是别名,因此被替换永久更改。