Scripting 設計 小考 C


下這個指令: last | perl -ne 'printf "%6d $2 $1\n", $3*60+$4 if /^(\w+)\s+\S+\s+\S+\s+(\S+).*\((\d\d):(\d\d)\)/' > login-dura.txt 而產生了一個檔案 login-dura.txt, 記載著每位使用者每次登入的分鐘數, 及星期幾。

請寫一個 perl 程式, 從命令列讀入兩個參數, 並印出統計數據。 第一個參數若是 "day" 就按照星期幾統計, 若是 "user" 就按照使用者統計。 第二個參數若是 "count" 就統計 「登入人次」, 若是 "sum" 就統計 「登入的總分鐘數」。 以下是各種不同執行方式的部分輸出。

        greg@penguin:~$ ./qC day count < login-dura.txt
        Fri            43
        Mon            55
        Sat            28
        Sun            30
        Thu            69
        Tue            75
        Wed           589

        greg@penguin:~$ ./qC day sum < login-dura.txt
        Fri          2481
        Mon          2307
        Sat          1257
        Sun          2864
        Thu          4399
        Tue          4771
        Wed         38837

        greg@penguin:~$ ./qC user count < login-dura.txt
        cloudcol        3
        greg          107
        jensin          4
        lhli            2
        s9414001        1
        ... (省略) ...
        s9714621        5
        s9714632       41
        yikuang        16

        greg@penguin:~$ ./qC user sum < login-dura.txt
        cloudcol      224
        greg        10468
        jensin          7
        lhli            1
        s9414001        6
        ... (省略) ...
        s9714621      208
        s9714632     4712
        yikuang       825

注意及提示:

  1. 這次小考可以不必檢查錯誤的輸入資料。
  2. 寫一點 (每增加一點功能), 就測試一下; 不要把整個程式寫完才測試。 (除非你是程式設計高手)
  3. 先想好: 你打算用一個 hash (省空間, 列印的程式碼又簡單), 還是四個 hashes? 迴圈要放在 if 外面 (程式碼較短), 還是 if 要放在迴圈外面?
  4. 建議逐次增加一點功能; 逐次上傳部分成果:
    1. 課堂練習的成果
    2. 加上 if 先只處理四種組合當中, 已寫好的這一種狀況; 遇到其他組合, 就印 "not yet"
    3. 加入第二種組合的程式碼
    4. 改成完全符合題目要求。