2010-01-18 80 views
1

我需要從$directory的內容製作3個數組。 第一個我可以使用:如何在Perl中創建一個目錄內容的數組?

$var = qx{ls $directory}; 
print $var; 

但是第二和第三我希望到grep爲「主*」和「二次*」

我使用的命令:

my @primary = 0; 
my @secondary = 0; 

@primary = system("ls test_77 > test | grep Primary* test"); 
print @primary; 
@secondary = system("ls test_77 > test | grep Secondary* test"); 
print @secondary; 

但是,它包括在輸出零:

PrimaryCPE_Option_A.txt.test_77 
PrimaryCPE_Option_B.txt.test_77 
0SecondaryCPE_Option_A.txt.test_77 
SecondaryCPE_Option_B.txt.test_77 
0 

什麼可以嗎?起初,它看起來可能是原來的零,但我可以改變它的初始值,但它不起作用。

+0

避免 '系統'。 – aartist 2010-01-18 18:42:17

+0

你是否真的把ls的輸出傳遞給grep,或者是|真的是分號?將ls輸出重定向到一個文件並將其輸出輸出到grep看起來很奇怪。 – toolic 2010-01-18 19:39:46

回答

3

Perl可以做到這一點,而無需調用系統命令。

@secondary=glob("*Secondary*.txt"); 
print @secondary; 
@primary=glob("*Primary*.txt") 
print @primary; 

其它方式使用執行opendir()/ readdir的(),或while循環如

while(my $file=<*Primary*txt>){ 
    push(@secondary,$file); 
} 

或者

push (@secondary,$_) while<*Secondary*.txt> ; 
+0

非常感謝,這是完美的工作。 你們都很棒! – Soop 2010-01-19 12:01:29

0

我想你應該使用opendir(和readdir等)。

目前,您正在生成新進程並將它們連接在一起,而Perl可以使用標準內置命令執行所有這些操作。結果將立即以數組的形式返回,以便使用Perl正則表達式進一步處理。

(請注意,你需要躲避*grep,如果你繼續你的方法。)

3

下面的操作將在當前目錄下的所有文件, 並將它們存儲到一個數組中。它不包括子目錄,但它包括以.字符開頭的 文件。然後,它從第一個數組創建另外兩個數組。請參閱File::Slurp

use strict; 
use warnings; 
use File::Slurp qw(read_dir); 

my @all_files = grep { -f $_ } read_dir('./'); 
my @pfiles = grep {/^Primary/ } @all_files; 
my @sfiles = grep {/^Secondary/} @all_files; 

我會盡力解決您的問題。 system返回外部命令的退出狀態(例如,ls)。它不返回目錄列表。您將使用qx返回目錄列表。參考system

因此,由於您的ls命令成功,其退出狀態爲0.因此,system返回0.此值存儲在數組的第一個元素中。這是你數組中唯一的值。我相信你看到的任何其他輸出都來自你的grep

而且,我來接近重現你的輸出的唯一方法是將管道改爲分號在system通話,並擺脫*

@primary = system("ls test_77 > test ; grep Primary test"); 
1

這是我會怎麼寫程序:

#! /usr/bin/env perl 
use strict; 
use warnings; 
use autodie; # this is so that you don't have to check opendir(), and readdir(). 

my @files = grep { 
    -f $_; 
} do{ 
    opendir my $dir, '.'; 
    readdir $dir; 
}; 

my @primary = grep {/Primary/ } @files; 
my @secondary = grep {/Secondary/} @files; 

你被宣佈這樣的陣列在名單上把0:

my @primary = 0; 

如果你想要一個空數組,你只需聲明它。

my @primary; 

如果你要明確設置一個數組來什麼:在使用Perl,儘可能

@primary =(); 
相關問題