簡體   English   中英

Perl從命令行使用通配符打開文件

[英]Perl open file from command line with wildcard

我以這種方式執行腳本:

./script.pl -f files*

我查看了其他一些線程(例如, 如何使用目錄名稱中的通配符在Perl中打開文件?

如果我用硬編碼將文件名寫在該線程中,則可以得到我想要的結果。 如果我從命令行獲取它,則不會。

我的options子例程應將以此方式獲得的所有文件保存在數組中。

my @file;
sub Options{
  my $i=0;
  foreach my $opt (@ARGV){
    switch ($opt){
      case "-f" {
        $i++;

        ### This part does not work:
        @file= glob $ARGV[$i];
        print Dumper("$ARGV[$i]");   #$VAR1 = 'files'; 
        print Dumper(@file);   #$VAR1 = 'files'; 
      }
    }
    $i++;
  }
}

似乎已經預先解釋了執行,並且在該過程中刪除了通配符(*)。

期望的結果:從命令行執行后,所有以文件開頭的文件都保存在數組中。

希望你能解決我的問題。 如果不能隨意問。

謝謝。

好吧,首先我建議使用一個模塊在命令行上執行args:例如Getopt :: Long

但是否則,您的問題就更簡單了-您的shell在perl獲取它之前擴展了'file *'。 (shell glob首先到達那里)。

如果您這樣做:

-f 'file*' 

然后它將正常工作。 您應該能夠看到此-例如-如果您只是:

use Data::Dumper;
print Dumper \@ARGV; 

我希望您會看到比您想象的更長的列表。

但是,我還要指出-perl可能會使用一個非常好的功能(取決於您對文件的處理方式)。

您可以使用<> ,它會自動打開並讀取命令行上指定的所有文件(按順序)。

由於您的外殼程序已經將glob files*擴展為files*名列表,因此Perl程序即可獲得此文件。

$ perl -E 'say @ARGV' files*
files1files2files3

如果您的Shell可以為您做,那么在Perl中就不需要這樣做。 如果您只需要數組中的文件名,則您已經擁有包含這些文件名的@ARGV

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM