プロが教えるわが家の防犯対策術!

perl.pl 引数1(項目) 引数2(A.txt)を実行する際に、
引数1を 他リスト(B.txt)にある複数 項目に 自動的に変更して実行させたい場合のスクリプトの書き方を教えていただければ幸いです。
初学者の質問で申し訳ありませんがよろしくお願いします。

質問者からの補足コメント

  • また、 一つ目の引数1で 処理を行い、
    結果が帰ってきたら 次の項目の引数1で実行というようにすることは可能でしょうか?

      補足日時:2016/04/19 17:24
  • 詳しく書かず申し訳ありません。
    イメージとして、
    perl script.pl 項目 B.txt(matrixデータ) という
    B.txtの中から 項目A(例えばflower や drinkなど)の行を抽出して、スクリプト.plに書かれた計算をおこない 項目と計算結果をresult.txtに書き出すという処理を行います

    B.txtの項目の中から、自分が調べたい項目名をC.txtに書き出していて、C.txtを読み込んでそれらの項目を順番に上記のコマンドで計算したいと考えています。
    No.2の回答者様の説明どおり 順番にコマンドを書いてシェルスクリプトに入れることも考えたのですが、
    項目が数百から数千項目あり、一度に実行すると負荷もかかるため 順番に項目を変えて、前の処理が終わった後に(もしくは一定時間ごとに)実行できればと思っています。

    わかりづらい説明で申し訳ありません。

    No.1の回答に寄せられた補足コメントです。 補足日時:2016/04/19 21:01
  • もともとのプログラム自体 過去の先輩たちが作っていて理解できていないので詳しく説明できません。このscript自体は 項目(item)をいれると、その項目を txtから抽出して各スクリプトに投げ込むというものだと思います。

    No.2の回答に寄せられた補足コメントです。 補足日時:2016/04/19 21:20
  • !usr/bin/perl
    use 5.12.0;
    use warnings;
    use autodie;

    my$item = shift;
    my$file = shift;
    open (FI, '<', "/home/$file");
    my$head = <FI>;
    open (FO, '>', "$item.txt");
    print FO $head;
    while (my$result = <FI>){
    if ($result =~ /^$item\t/){
    print FO $result;
    }
    }
    close FI;
    close FO;

    system "perl script2.pl /home/$file /home/matrix.tab $item.txt &";
    …… exit;
    このようなスクリプトです。

      補足日時:2016/04/19 21:24

A 回答 (3件)

メインルーチン全体をループにして...って構造でできそうですが、詳細はプログラムを見ないことにはなんとも。


# 見ても作るかどうかはなんとも....

> また、 一つ目の引数1で 処理を行い、
> 結果が帰ってきたら 次の項目の引数1で実行というようにすることは可能でしょうか?

これも、おそらくは「可能」ですが、詳細がわからなければ、具体的な方法を提示することはできません。



単純に連続で実行するだけなら、テキストエディタの置換とか、sedとかを使って
perl スクリプト.pl B.txtの項目1 A.txt
perl スクリプト.pl B.txtの項目2 A.txt
perl スクリプト.pl B.txtの項目3 A.txt
....
ってファイルを作って、(windowsなら 〜.batってファイルにして)
sh ファイル とか (Windowsなら 〜.bat )
で実行する、という方法もあります。
この回答への補足あり
    • good
    • 0

> 結果が帰ってきたら 次の項目の引数1で実行



これの意味がなんとなくわかった気がする。


system "perl script2.pl /home/$file /home/matrix.tab $item.txt &";

system関数は、指定したコマンドを実行する関数です、
http://perldoc.jp/func/system
execも参照のこと。
http://perldoc.jp/func/exec

""なので、変数の展開等が行なわれ
perl script2.pl /home/引数2 /home/matrix.tab 引数1.txt &
を実行します。これは、同じコマンドをコマンドラインシェルから入力したのと同じことです。

コマンド入力時に、最後に& を付けると、終了を待たずにバックグラウンドで実行されます。
「一度に実行」されるのは、このためです。

&を取れば、終了まで待つので、負荷は軽くなります。
時間はかかるかもしれませんが。
    • good
    • 0

求めている動作はどのようなものなのでしょうか? イメージをつかみやすくするような具体例を挙げることはできませんか?



あと, 補足の「結果が帰ってきたら 次の項目の引数1で実行」のところですが, 「次の項目の引数1で」とあるからにはそれぞれの項目ごとに「引数1」とか「引数2」とかがあるということですよね. 「項目」の形がまったく書かれていないのですが, これらの「引数」はどのように見分ければいいのですか?
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!