2013-05-29 55 views
0
1440665 8 drwxrwx--- 2 smithjoe smithjoe  1024 May 29 09:01 . 
1960596 8 -rwxrwx--x 1 smithjoe smithjoe  3190 May 29 09:00 ./file1.prl 
3197096 8 -rw-rw---- 1 smithjoe smithjoe  1594 May 24 16:11 .dir/documents/file2.prl~ 
1790401 8 -rw------- 1 smithjoe smithjoe  3205 May 29 09:01 .dir/files/file3.prl 
6754401 8 -rw------- 1 smithjoe smithjoe  3205 May 29 09:01 .smithjoe/file3.prl 
2737401 8 -rw------- 1 smithjoe smithjoe  3205 May 29 09:01 .smithjoe/folder2 

我有一個數組(@file_path),其中包含上面提供的數據。我希望能夠從數組中提取文件/目錄名稱(這是該行的最後一個元素)。我必須使用foreach循環。一旦我做到了。我跳過目錄並將它們保存在一個新的數組中。我用push命令追加數組。通過具有目錄路徑和文件名(perl)的數組的foreach循環

幫我一把。請。

+3

你是怎麼想出這樣的陣列的?有更好的方法來讀取目錄。 –

+1

@mpapec:鑑於「我必須使用foreach循環」的聲明,我猜這是作業,解析'ls -l'的輸出也是賦值的參數之一。 –

+0

@DaveSherohman似乎老師有深刻的分配家庭作業的方法。 –

回答

2

我想重新評論@ mpapec的評論,你可能首先想通過修復你得到的數據來解決這個問題,而不是試圖操縱它。另外,我需要在這裏加上前綴,表示這會扼殺文件名和路徑中的空白 - 我不確定是否有一種好的可靠方法可以避免不引入其他怪癖,因此建議修復在您嘗試處理它之前的數據。

但是,如果你堅持你的數據,你相信你不會有文件名/路徑空白:

my @paths; 
foreach my $line (@file_path) { 
    my @parts = split /\s+/, $line; 
    push @paths, $parts[-1]; 
} 

...應該讓你對你的方式。

+0

@sohailkhan我很困惑你想要什麼;在我的例子中,至少當我測試它時,@paths包含每行'ls'輸出的最後部分(即路徑和文件名位)。如在http://pastebin.ca/2384570 –

+0

2384570哪裏來的?你想要輸出的每一行的第一個*部分而不是最後一個?因爲一羣人以你想要的最後一個假設回答了這個問題。 無論如何,如果你這樣做,只需用'[0]'替換'[-1]'來取代第一部分而不是最後一部分。 –

+0

啊哈。這可能是最安全的 - 你可以在'split'調用中用'/ \ //'替換'/ \ s + /',並且我的原始代碼示例會在每行最後一個'/' - 即文件名。 –

2

一對夫婦提示你:

  • 假設文件路徑將永遠不會包含空格,則可以使用split命令到每行分隔字段,並將其分配到一個數組。如果它們可以包含空格,則split爲可返回的最大字段數輸入可選的第三個參數。

  • 在Perl中,$array[-1]返回@array中的最後一項。

這兩個提示應該允許你從每一行獲取文件路徑。

+1

@sohailkhan'perldoc -f split' –

+1

你可以使用ls而不用-l選項 - 然後,你已經準備好用foreach遍歷數據了:-) –

+1

更不用說'ls -1': ) –