2013-04-30 46 views
2

我是新來的perl。如何使用「或」運算符將多個值分配給變量?

我想說,一個變量可能需要2個值,然後我從另一個函數調用它。

我想:

my(@file) = <${dirname}/*.txt || ${dirname}/*.xml> ; 

但這似乎不工作的第二個價值,有什麼建議?

+1

'glob「$ dirname/...」'是越野車。例如,對於其中包含空格的目錄會失敗。 – ikegami 2013-04-30 11:14:11

+0

'<$ {dirname}/*。txt>,<$ {dirname}/*。xml>'也可以寫成'<$ {dirname}/*。{txt,xml}>' – ikegami 2013-04-30 11:15:09

回答

0
my(@file) = <${dirname}/*.txt>, <${dirname}/*.xml> ; 

<>將它轉換爲一個文件名的數組,所以你基本上在做我的@file = @ array1,@ array2。這將首先遍歷txt文件,然後通過xml文件。

0
my (@file) = (<${dirname}/*.txt>, <${dirname}/*.xml>); 
6

當使用<*>運營商爲運營商fileglob,你可以使用任何常用的glob模式。可用模式是

  • *(任意數量的任何字符),
  • ?(任何單個字符),
  • {a,b,c}(任何abc圖案),

所以你可以做

my @file = glob "$dirname/*.{txt,xml}"; 

my @file = (glob("$dirname/*.txt"), glob("$dirname/*.xml")); 

my @file = glob "$dirname/*.txt $dirname/*.xml"; 

的水珠圖案的空白被分成子模式

+0

使用匿名數組或哈希來完成任務? 'my @file =([(glob(「$ dirname/*。txt」))] [[glob(「$ dirname/*。xml」))])' – gaussblurinc 2013-04-30 12:38:20

1

如果我理解正確的,你想@files退卻。如果第二個選項(*.xml)沒有找到*.txt文件。

如果是這樣,你的語法是接近的。它應該是:

my @files = <$dirname/*.txt> || <$dirname/*.xml>; 

my @files = glob("$dirname/*.txt") || glob("$dirname/*.xml"); 

此外,這是一個好主意,檢查@files,以確保它的填充(如果你沒有什麼任何*.txt*.xml?)

warn 'No @files' unless @files; 
0

這工作

my $file = $val1 || $val2; 

它的意思是設置$文件$ VAL1,但如果$ VAL1爲0或虛假或民主基金,然後設置$文件1至$ VAL2

在本質上,圍繞一個變量< >意味着要麼

1)把它當作一個文件句柄(例如$read=<$filehandle>

2)使用它作爲一個殼水珠(例如@files=<*.xml>)像你想插值$目錄名稱,並添加任何.TXT或.xml上月底

在我看來。如果你希望兩個值發送到函數,那麼這可能是你想要

my @file=("$dirname.txt","$dirname.xml"); 

然後調用與@file的功能是什麼<>是不能達到這個

,即myfunction(@file)

sub myfunction { 
    my $file1=shift; 
    my $file2=shift; 

所有這些東西是覆蓋在perldocs文檔功能perlsub和perldata

玩得開心