2012-09-17 102 views
3

我在分配參數值/命令行參數時遇到了麻煩。這是我真正想要做的。在perl中傳遞命令行參數

Test.pl 
#!/usr/bin/perl 

#Variable declaration 

$RUN_DIR="/home/ckhau/database/experiment/test"; 
    #Main program 

$index=-999; 
#my $ARGV; 
@files = <$RUN_DIR/b*.txt>; 

foreach $file (@files) 
{ 
#$SCRIPT="perl abcdinfo.pl $file"; 
$SCRIPT="perl abc.pl $file"; 
system("$SCRIPT");  
} 

我試圖與@ARGV取代的b * .txt和試圖運行該程序即當i相

@files = <$RUN_DIR/@ARGV>; 

然後替換上面的代碼嘗試使用命令行運行

perl Test.pl b*.txt 

這給了我一個錯誤Perl:不匹配。任何人都可以幫我解決以下問題。

如何使用此命令行參數?

我可以在命令行「b * .txt」或「r _ *。txt」中使用這些語法嗎?

+1

這可能與shell不能很好地處理命令行參數中的*有關。 – Gyan

+0

你在運行這個腳本的shell是什麼? Windows命令提示符? Linux bash shell? –

+0

@Jonah Bishop:我正在使用linux – unkaitha

回答

3

shell正試圖將b*.txt擴展到當前目錄中匹配文件的列表。一旦你的程序接收到這些價值,你glob看起來像

@files = </home/ckhau/database/experiment/test/b1.txt b3.txt b3.txt> 

其中ISN;噸你想要什麼,如果沒有b1.txt$RUN_DIR目錄

,以防止shell將無法找到任何文件通配符你只需把它放在引號中的通配符文件模式,所以你的命令變爲

perl Test.pl 'b*.txt' 

除此之外,你的程序確實需要改進。您應該在所有程序的開頭始終使用use strictuse warnings,並在首次使用時聲明每個變量;您應該只使用@ARGV的第一個元素作爲文件模式,而不是整個數組;它是錯把標量加上引號,當你只是希望自己的內容

在這個重構原始的

#!/usr/bin/perl 

use strict; 
use warnings; 

my $run_dir="/home/ckhau/database/experiment/test"; 

my $pattern = "$run_dir/$ARGV[0]"; 

my $index = -999; 
my @files = glob $pattern; 

foreach my $file (@files) { 
    my $script = "perl abc.pl '$file'"; 
    system $script; 
} 

更新

的看看如果你真的想有多個通配符模式作爲Test.pl的參數,那麼您必須將$run_dir目錄打包到每個目錄的開頭。最好的辦法是使用File::Spec模塊的rel2abs函數。完整的腳本將如下所示

#!/usr/bin/perl 

use strict; 
use warnings; 

use File::Spec; 

my $run_dir="/home/ckhau/database/experiment/test"; 

my $pattern = join ' ', map File::Spec->rel2abs($_, $run_dir), @ARGV; 

my $index = -999; 
my @files = glob $pattern; 

foreach my $file (@files) { 
    my $script = "perl abc.pl '$file'"; 
    system $script; 
} 
+0

非常感謝Borodin ...對我來說工作正常.. – unkaitha

+0

你在更新中提到的那個是我真正想要的那個,也就是說。我將不得不提供很多通配符模式但是我無法安裝這些CPAN模塊,因此是沒有這些模塊的情況下更好的方法。 – unkaitha

+0

建議新手使用'嚴格使用'和'使用警告' – David