AWK

あだーーー(挨拶)えいだです?テンションの切り換えが難しいですそんなことないですよ。うちはうち、あなたは(ry


いよいよ、Adaプログラミングの始まりです!3日で覚えるAdaならぬ、3日間始まらなかったAdaプログラミングの時間!
さて、今日はさっそく!AWKをやります!



…もはや今回は「AWKやります」って言いたかっただけなので、こっから先は読まなくてもよいです!

〜 あらすじ 〜
ネタ探すために/usr/lib/gcc/i486-linux-gnu/4.1.3/adainclude/探ってたら、g-awk.adbとかいうソースを見つけた。

なんとっと!驚くべきことに!Ada(というより、GNATがー)には、AWKライブラリが含まれていたのでする!


g-awk.adsのコメントより

--  This is an AWK-like unit. It provides an easy interface for parsing one
--  or more files containing formatted data.

AWKのような文字列処理ができるライブラリのようなそうでないような。使いかたはこのコメントのあとに全部書いてあるので、各自参照のこと以上っっ!


以下、適当に書いたサンプルー

-- passwd_line.ads
package Passwd_Line is
   procedure Passwd_Line(User_Name:String);
end Passwd_Line;
-- passwd_line.adb
with GNAT.AWK;
with Ada.Text_Io;

package body Passwd_Line is
   Computers : GNAT.AWK.Session_Type;

   procedure Dump_Shell is
   begin
      Ada.Text_Io.Put_Line( GNAT.AWK.Field(7,Computers) );
   end Dump_Shell;

   procedure Passwd_Line ( User_Name : String ) Is
   begin
      GNAT.AWK.Set_Field_Separators(":",Computers);
      GNAT.AWK.Add_File("/etc/passwd",Computers);
      GNAT.AWK.Register(1, User_Name ,Dump_Shell'Access,Computers);

      GNAT.AWK.Parse( Session => Computers );
   end Passwd_Line;
end Passwd_Line;
-- get_shell.adb
with Passwd_Line;
with Ada.Command_Line;
with Ada.Text_Io;

procedure Get_Shell is
begin
   if Ada.Command_Line.Argument_Count < 1 then
      Ada.Text_Io.Put_Line("usage: get_shell name");
   else
      Passwd_Line.Passwd_Line( Ada.Command_Line.Argument(1) );
   end if;
end Get_Shell;

/etc/passwdから引数で与えられた人の名前のシェルを取得できまするー。/etc/passwdを見るあたりにクラッカ魂を感じますねいやそれはないです。

~/test/ada $ gnatmake get_shell
gcc-4.1 -c get_shell.adb
gcc-4.1 -c passwd_line.adb
gnatbind -x get_shell.ali
gnatlink get_shell.ali
~/test/ada $ ./get_shell root
/bin/bash
~/test/ada $ ./get_shell sshd
/usr/sbin/nologin
~/test/ada $ ./get_shell Ada
~/test/ada $ ./get_shell ada
~/test/ada $ 

ショック!!えいだにはアカウントが与えられてぬー。


いくつか感想を

  • コンパイル遅いから全然便利な気がしぬー!(note:マシンを速くしましょう)
  • ひとつのファイルにトップレベルのSubprogram一個しか置けないから、コールバックのためにファイル分けるか、パッケージ作らないといけないのめんどー!
  • グローバル変数気軽に使いすぎだー

あんまり使える気がしぬー。
でも設定ファイルとか、コロン区切りにすることはたまにあるので、そおういう場合に、ちょろちょろっと書けるのは嬉しいかもしれぬですな。(note:XMLを使いませう)


今日のAdaメモ:(最終回かも)
引数が名前付きなのだけど、微妙に便利でする。C++だと、デフォルト引数が後ろのほうにしかできないけど、名前付き引数のおかげで、デフォルト引数の順番を気にしないでよさげ…と思ったけど、Pythonもそんな感じだったような。