討論區快速選單
知識庫快速選單
網路投保旅行平安險 想要資料分析就學Python 政府補助!學嵌入式+物聯網
[ 回上頁 ] [ 討論區發言規則 ]
請問如何執行perl+檔案名稱
更改我的閱讀文章字型大小
作者 : ryan1(ryan1)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/4/17 上午 11:55:06
簡單講就是
my $input = <STDIN>; # 從標準輸入裝置取得資料
print $input;
我如何可以在terminal執行perl一行搞定,如./檔名 檔案名稱就直接run
而不需要在terminal執行perl二行執行./檔名後 ,在鍵入檔案名稱.
作者 : infraviolent(IV)
[ 貼文 9 | 人氣 0 | 評價 50 | 評價/貼文 5.56 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人ryan1註記此篇回應為很有道理 2013/4/18 上午 12:11:11
不清楚閣下的意思是否這樣:

print @ARGV;

ARGV 是一個環境變數
加上 @ 代表存取整個陣例
加上 $ 代表存取單個純量數值

例如:print $ARGV[ 0 ];

陣例的最尾的索引值是:$#變數名,例如:$#ARGV
可由 $#ARGV 求出陣例長度
作者 : ryan1(ryan1)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/4/18 下午 08:15:11
Thank you infraviolent:
我就是要學argv()function,可以是我拿網路上的程式來run沒反應耶,我打perl ex.pl 1.txt 2.txt什麼東西都沒發生耶.
 如文件1的内容:
1320238
1320239
1320239
1320238
1320238
1320238
1320235
1320237

文件2的内容:
102 5709072117805887 4001 1301854
102 5709072117807510 4001 1320292
102 5709072117838653 4001 1301857
102 5709072117814280 4001 1305832
102 5709072117839397 4001 1310673
102 5709072117839335 4001 1311270

我想先把文件1的内容读取出来,然后读取文件二的内容,在读取文件2的内容的时候,文件2的最后一列需要包含在上文件1内。
[root@localhost ~]$ perl ex.pl 1.txt 2.txt
[root@localhost ~]$ cat ex.pl
#!/usr/bin/perl
use strict;

open(ONE,"$ARGV[0]") or die $!;
open(TWO,"$ARGV[1]") or die $!;

my %hash;
while (<TWO>) {
    chomp;
    my @line=split;
    my $column4=$line[3];
    $hash{$column4}=$_;
}

while (<ONE>) {
     chomp;
     print $hash{$_} if defined $hash{$_};
    
}

print"\n";
作者 : infraviolent(IV)
[ 貼文 9 | 人氣 0 | 評價 50 | 評價/貼文 5.56 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/4/19 上午 12:46:28
其實 Perl 一開始並不是一種程式語言,它只是一套工具集(用來解決 Unix 上的文字處理問題,類似 bash、awk 一類)
所以閣下會發現 Perl 的 function( 正名是 subroutine )的參數傳遞機制很奇怪,類似 bash。

例如:
1. print 參數 ;
2. print( 參數 ) ;
3. print ;

以上都是合乎語法的寫法。其中第三種要說明一下,有很多(不一定是全部!) subroutine 在沒有參數的情況下,預設用 _ 參數。
_ (底線參數)可以是陣列,例如:@_ ,也可以是純量,例如:$_ ,視乎情況而定。

有了以上的認知便可以理解程式碼。

#!/usr/bin/perl
use strict;

open(ONE,"$ARGV[0]") or die $!; <--- open subroutine 把 ARGV[0] 的檔案內容放入 ONE,用 <ONE> 便可存取。
open(TWO,"$ARGV[1]") or die $!; <--- open subroutine 把 ARGV[1] 的檔案內容放入 TWO,用 <TWO> 便可存取。

my %hash;
while (<TWO>) { <--- while 把 <TWO> 的檔案內容每一行逐次放入 $_
    chomp; <--- chomp 把 $_ 移除換行字元
    my @line=split; <--- split 把 $_ 以空格劃分拆成一個個元素放入 @line
    my $column4=$line[3];
    $hash{$column4}=$_; <--- 以 ARGV[1] 的檔案內容中每一行第四列作 Key ,內容為當前每一行檔案內容
}

while (<ONE>) { <--- while 把 <ONE> 的檔案內容每一行逐次放入 $_
     chomp; <--- chomp 把 $_ 移除換行字元
     print $hash{$_} if defined $hash{$_}; <--- 以 ARGV[0] 的檔案內容中每一行移除換行字元後作 Key print 出元素
    
}

print"\n"; <--- 輸出空白行

*** 輸出結果只有空白行是因為 文件1 沒有 文件2 數值相同的 Key,只要閣下 copy 一個 文件2 的 Key 後重試便有內容出現。
作者 : infraviolent(IV)
[ 貼文 9 | 人氣 0 | 評價 50 | 評價/貼文 5.56 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/4/19 上午 12:50:02
更正:只要閣下 copy 一個 文件2 的 Key 放入 文件1 後重試便有內容出現。
作者 : ryan1(ryan1)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/4/19 下午 02:18:12
您說copy 一個 文件2 的 Key 放入 文件1(是哪個KEY呢?)copy完後我是不是只要執行perl ex.pl 1.txt 2.txt就會有結果.
作者 : infraviolent(IV)
[ 貼文 9 | 人氣 0 | 評價 50 | 評價/貼文 5.56 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/4/19 下午 06:15:15
非常抱歉,之前回覆的程式碼亂了位置,很難睇清楚。

在閣下的程式碼當中,第 11 行:
---> my $column4 = $line[3];

Key 是指 文件2 的第四欄數字,例如:

102 5709072117805887 4001 1301854 <--- Key 是 1301854
102 5709072117807510 4001 1320292 <--- Key 是 1320292
102 5709072117838653 4001 1301857 <--- Key 是 1301857
102 5709072117814280 4001 1305832 <--- Key 是 1305832
102 5709072117839397 4001 1310673 <--- Key 是 1310673
102 5709072117839335 4001 1311270 <--- Key 是 1311270
作者 : infraviolent(IV)
[ 貼文 9 | 人氣 0 | 評價 50 | 評價/貼文 5.56 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/4/19 下午 06:43:20
閣下的程式碼有以下的功能:

1. 把 文件2 的内容放入 %hash。

%hash 的内容變成:
Value : 102 5709072117805887 4001 1301854 <--- Key : 1301854
Value : 102 5709072117807510 4001 1320292 <--- Key : 1320292
Value : 102 5709072117838653 4001 1301857 <--- Key : 1301857
Value : 102 5709072117814280 4001 1305832 <--- Key : 1305832
Value : 102 5709072117839397 4001 1310673 <--- Key : 1310673
Value : 102 5709072117839335 4001 1311270 <--- Key : 1311270

2. 以 文件1 中的數值作 Key ,到 %hash 中尋找 Value ,找到後再 print 出來。

但是當你仔細觀看 文件1 的内容的時候,你會發現 文件1 中沒有和 文件2 的 Key 相同的數值,所以閣下的程式沒反應。
只要閣下放一個 文件2 的 Key 入 文件1 後執行 perl ex.pl 1.txt 2.txt 就會有結果。
作者 : infraviolent(IV)
[ 貼文 9 | 人氣 0 | 評價 50 | 評價/貼文 5.56 | 送出評價 0 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人ryan1註記此篇回應為最佳解答 2013/4/20 上午 12:02:53
補充一下基本知識,方便閣下理解。

Array 有兩種類型:

第一種用數字( 又稱為 index )作索引存取資料,稱為 array
第二種用文字( 又稱為 key )作索引存取資料,稱為 associative array ( 在 Perl 中又稱為 hash )


Array 的例子:

my @array = ( 1, 2, 3 );
print $array[0];



Hash 的例子:

my %hash = (
    'Key_1' => 1,
    'Key_2' => 2,
    'Key_3' => 3
);

print $hash{ 'Key_1' };

*** array 的資料順序放於記憶體內;但 associative array 的資料沒有次序!!
作者 : ryan1(ryan1)
[ 貼文 10 | 人氣 0 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2013/4/22 上午 10:20:35
謝謝infraviolentd可以了,原來是要用key word去呼叫2.txt.小弟初學者請多多指導.
 板主 : 徵求中
 > Perl - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Perl - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Perl
1 HKLN.net 2850 
2 Benson 480 
3 Jsn 470 
4 pail 240 
5 可愛處理器 170 
6 菜鳥小德 160 
7 mrhsuap 160 
8 kalua 120 
9 110 
10 jackkon 100 
Perl
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2018 程式設計俱樂部 http://www.programmer-club.com.tw/
0.046875