Perl Tips: 外部コマンド実行
2018/08/25
system関数
  • Perlから外部コマンドを実行する方法の一つに system関数 があります。

  • List 1: system関数使用例
    コード
      #!/usr/bin/perl -w
      use strict;
      {
          system('date');
          system('echo "waiting 5sec ..."');
          system('sleep 5');
          system('date');
      }
      
    出力
      2018年  8月 25日 土曜日 08:58:41 JST
      waiting 5sec ...
      2018年  8月 25日 土曜日 08:58:46 JST
      

  • 'sleep 5' してから次の 'date' が実行されているのがわかります。systemはコマンドの終了を待ちます

  • 終了を待たずにコマンド実行するには、Perlの機能ではありませんが、Linux/Unixの場合バックグラウンド実行の & を付ける方法があります。

    List 2a: Linux/Unixのバックグラウンド実行を利用
    コード
      #!/usr/bin/perl -w
      use strict;
      {
          system('date');
          system('echo "waiting 5sec ..."');
          system('sleep 5 &'); # バックグラウンド実行 
          system('date');
      }
      
    出力
      2018年  8月 25日 土曜日 09:19:45 JST
      waiting 5sec ...
      2018年  8月 25日 土曜日 09:19:45 JST
      

  • Windowsの場合、startコマンドを利用して別プロセス化することで、終了を待たずに次のステートメントを実行することができます。

    List 2b: Windowsではstartコマンド利用
    コード
      #!perl -w
      use strict;
      
      {
          system('echo %date% %time%');
          system('echo waiting 10sec ...');
          system('start /i timeout /t 10 /nobreak');
          system('echo %date% %time%');
      }
    出力
      2023/06/03 14:18:22.31
      waiting 10sec ...
      2023/06/03 14:18:22.37
      

バッククォート(`)とopen
  • コマンドの出力結果を取り込みたいときは `演算子(backquote/backtick)を使います。

    List 3: 実行結果の取り込み(1)
    コード
      #!/usr/bin/perl -w
      use strict;
      {
          my @list = `ls *.txt`;
          foreach my $buf (@list) {
              print $buf;
          }
      }
      
    出力
      file_000.txt
      file_001.txt
      file_002.txt
      file_003.txt
      file_004.txt
      file_005.txt
      

  • open関数を使用することもできます。open関数ならば出力結果をストリームで扱うこともできます。

    List 4: 実行結果の取り込み(2)
    コード
      #!/usr/bin/perl -w
      use strict;
      {
          my $fh;
          open($fh, 'ls *.txt |') or die;
          while(my $buf = <$fh>) {
              chomp($buf);;
              print $buf;
              print ' : 002 is found.' if ($buf eq 'file_002.txt');
              print "\n";
          }
          close($fh);
      }
      
    出力
      file_000.txt
      file_001.txt
      file_002.txt : 002 is found.
      file_003.txt
      file_004.txt
      file_005.txt
      
2023/06/03: Windows startコマンド利用追記
2018/08/25: 初版
Copyright(C) 2018 Altmo
本HPについて