2013-05-08 44 views
0

我創建了一個Perl腳本來從相對路徑中提取文件名。 這是一個將路徑作爲參數的子集,然後根據它計算名稱,然後將其附加到全局變量。在Perl中等同字符串變量?

my $all_names = ""; 
sub check_line 
{ 
    my @args = @_; 
    my $line = $args[0]; #take the path 
    my @paths = split(/\\|\//, $line); #split according to folder 
    my $last = @paths; 
    $last = $last - 1; 
    my $name = $paths[$last]; #take the file name 
    chomp($name); #remove \n character from end of string 
    my ($ext) = $name =~ /(\..+)/; #extract the file extension from file name 
    if(($ext eq ".h") || ($ext eq ".cpp") || ($ext eq ".c")) #filter the required files 
    { 
     $all_names = $all_names . "$name "; #append the file names to global variable 
    } 
} 

現在這個腳本在Perl 5.005中工作正常(是的,我們也有舊版本的Perl!)。 但是,如果我在Perl 5.10上運行它,它將無法正常運行。 文件擴展名檢查總是返回false。 甚至當我打印的文件擴展名,我得到它的正確或.h.c即使我個人比較一下

if($ext eq ".c") 

然後,它返回false。 這裏有什麼可能是錯的? 謝謝。

+0

如果打印'長度($ EXT)',它打印2' .c'? – Andomar 2013-05-08 05:47:53

+0

@Andomar否,它的印刷3.爲什麼會發生這種情況? 不應該chomp刪除所有這些\ n。 \ r個字符? – 2013-05-08 06:04:48

回答

2

這不是因爲版本的變化。

您可能有一個帶有CR LF結尾的文件,並且您在非Windows計算機上運行。

您可以修復dos2unix或類似的行尾。

或者,你可以改變

chomp($name); 

$name =~ s/\r?\n\z//; 

或更好,但

$name =~ s/\s+\z//; 
+0

問題在於Windows 7上的cygwin。 使用舊版本的Perl,腳本即使在沒有dos2unix的情況下也能運行在Sun上。 – 2013-05-08 05:56:48

+0

不chomp刪除\ r字符? – 2013-05-08 05:58:07

+0

你能解釋一下\ z是什麼嗎? – 2013-05-08 06:08:03