2012-03-11 315 views
4

我正在嘗試使用@ARGV數組獲取一個輸入文件,並將所有元素寫入一個在perl中帶有分隔符空格的數組。讀取輸入文件並將其放入一個帶有空格分隔符的數組中Perl

樣本輸入參數例如TXT文件:

0145 2145 
4578 47896 
45 78841 
1249 24873 

(有多個線路的,但在這裏沒有顯示) 的問題是:

  1. 我不知道如何例如ARG [0]到一個數組
  2. 我想將該輸入文件的每個字符串作爲單個字符串換句話說,行1 0145 2145不會是一個字符串,它將通過與空間分隔而成爲兩個不同的字符串。

回答

5

我想這是你想要的。此代碼中的@resultarray將最終保存一個數字列表。

如果你給你的程序文件名作爲命令行輸入來使用,把它關閉了argv數組並將其作爲一個文件句柄:

my $filename = $ARGV[0]; 
open(my $filehandle, '<', $filename) or die "Could not open $filename\n"; 

一旦你的文件句柄就可以使用while循環遍歷文件的每一行。 chomp將每行的結尾處的新行字符取出。使用split根據空格分隔每行。這將返回一個數組(在我的代碼中爲@linearray),其中包含該行內的數字列表。到我@resultarray年底我再push我的線陣列。

my @resultarray; 
while(my $line = <$filehandle>){ 
    chomp $line; 
    my @linearray = split(" ", $line); 
    push(@resultarray, @linearray); 
} 

而且記得要加

use warnings; 
use strict; 

在Perl文件來幫助你的頂部,如果你在你的代碼中的任何問題。


只是爲了澄清你如何處理不同的輸入你的程序。下面的命令:

perlfile.pl < inputfile.txt 

將採取inputfile.txt和管道它的內容STDIN文件句柄。然後,您可以使用該句柄來訪問inputfile.txt

while(my $line = <STDIN>){ 
    # do something with this $line 
} 

的內容,但你也可以通過將其放在執行命令後,給你的程序讀取一些文件名:

perlfile.pl inputfile1.txt inputfile2.txt 

這些文件的名稱會被解讀爲字符串並放入@ARGV數組,這樣的陣列將是這樣的:

@ARGV: 
    [0] => "inputfile1.txt" 
    [1] => "inputfile2.txt" 

由於這些文件只是名字,你需要運在訪問文件內容之前,先在perl中創建文件。所以對於inputfile1。TXT:

my $filename1 = shift(@ARGV); 
open(my $filehandle1, '<', $filename1) or die "Can't open $filename1"; 

while(my $line = <$filehandle1>){ 
    # do something with this line 
} 

注意我是如何使用shift這次獲得數組@ARGV中的下一個元素。有關班次的更多詳情,請參閱perldoc。還有關於open的更多信息。

+0

非常感謝你,但我希望看到數組中的元素,所以當我寫 的foreach $值(@resultarray) { 打印($值); } 然後它給像 全局符號「$值」的錯誤,需要明確包名在C:\用戶...... 如何打印元素 – 2012-03-11 14:17:41

+0

,也爲你的代碼,錯誤的是 http://imageshack.us/photo/my-images/341/asdasdfasfagfq.png/ – 2012-03-11 14:27:11

+0

打印時出現的錯誤是'use warnings'編譯指示的結果。它要求你在開始時用包名定義所有變量。所以在你的情況下,你必須寫'我的$ value'而不是'$ value'。以這種方式編寫perl代碼是一個非常好的想法,因爲一旦習慣它,你將花費更少的時間來調試程序。 – MattLBeck 2012-03-11 15:12:56

相關問題