Perlでコマンドの結果値を表示する方法

このQ&Aのポイント
  • Perlでちょっとしたアプリを作っていて、コマンドの結果値をHTMLで表示させる方法について教えてください。
  • C言語で作成したアプリをPerlに移行したい場合、popen()やfgets()、strtok()に相当する関数を使う方法を教えてください。
  • 初めてPerlを触るため、ネット上には参考になる情報がなかなか見つからない状況です。アドバイスをお願いします。
回答を見る
  • ベストアンサー

Perlでpopen()的なものを使って・・

今Perlでちょっとしたアプリを作っています。 サーバはunix系でアプリの内容はコマンドの結果値をHTMLで表示させるというものです。 一度Cで作って成功しました。 簡単に書きます。(HTMLの表示部分は簡略します) int main() { char *token; char str[1024]; FILE *fp = popen("ls -la","r"); while(fgets(str,1024,fp)!=NULL){ token = strtok(str,NULL); printf("結果:%s\n",token); } exit(0); } とコマンド(例:ls -la)を実行してファイルハンドルを返してコマンドの結果値を読み取って表示させるというものなのですが、これをPerlに移行したいと考えています。 Perlをさわるのが初めてでしてネットで調べてみても なかなか参考になるものはありません。 Perlの関数にpopen()が存在するのかまたfgets()、strtok()に類似する関数がありましたらアドバイスいただけないでしょうか。 よろしくお願いします。

  • fm0606
  • お礼率13% (100/761)
  • Perl
  • 回答数2
  • ありがとう数4

質問者が選んだベストアンサー

  • ベストアンサー
  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.2

print `ls -la`; が一番簡単だと思いますが、あえて質問文に似せるなら、 open (ls, 'ls -la |'); while(read( ls,$result,1024)){ print $result; } close(ls); ぐらいかな。 もう少し簡略化して、 open (ls, 'ls -la |'); while(<ls>){ print; } close(ls); とも書けます。 strtokが何をしているか、いまいちよくわからないので無視しています。 一応、 popen()->open() fgets()->read() strtok()->split() ぐらいに対応すると思います。 splitはちょっと違うかもしれませんが。 http://plaza27.mbn.or.jp/~satomii/jdoc/perltut/split.html

参考URL:
http://www.tokyo-nagasaki.net/dayan/tips/unix/perl.html
fm0606
質問者

お礼

できました!! ありがとうございます。

その他の回答 (1)

回答No.1

C言語はあまり存じ上げないのですが、 system関数はCにもありませんでしたっけ? print system("dir"); #win系なら でそのまま一覧表示できたりします。 (単純すぎて物足りないものでしょうか?) もしくは、バッククオートを使って、 print `dir`; でも同じことができます。 こちらの方が応用がきくかもしれません。 FileHandle使わなくても、 my @list = `dir`; で代入まで済みますので、 多分popen()の代わりにこの場合なっていると思います。 その他 Shellモジュールもコマンド操作用に用意されてますので、 興味があれば調べてみてください。 #何分Cの方がわかっていないので、勘違いしていたらすみません。

関連するQ&A

  • _popen() のエラー取得

    WindowsNT/2000で_popen()を利用してコマンドを実行しているのですが、その際のメッセージを取得したいのですが、通常のメッセージは取得出来るのですが、エラーメッセージが取得出来ません。どうすればよいのでしょうか? 現在のソースは下記のようです。 int main(int argc, char* argv[]) { char str[512],*ptr; FILE *fp; if((fp = _popen("dir b:","rt")) == NULL) { fprintf( stderr , "error!!!\n"); return -1; } while(1) { fgets(str,512,fp); if(feof(fp)) { break; } ptr = strchr(str,'\n'); if(ptr != NULL) { *ptr='\0'; } printf("%s\n",str); } _pclose(fp); return 0; }

  • popen・pcloseについて

    popen・pcloseについて 以下のようにpopenを使ってdirコマンドを打った時と同じようなプログラムを Microsoft Visual C++ 2008上で作ったのですが #include <stdio.h> int main(void) { FILE *fp; char buff[64]; fp=popen("dir","r"); while(fgets(buff,sizeof(buff),fp)!=NULL){ printf("%s",buff); } pclose(fp); return 0; } これをビルドした所、以下のようなエラーが出てしまいました。 c:\users\yamaomoto\documents\visual studio 2008\projects\popen\popen\popen.c(8) : warning C4013: 関数 'popen' は定義されていません。int 型の値を返す外部関数と見なします。 c:\users\yamaomoto\documents\visual studio 2008\projects\popen\popen\popen.c(8) : warning C4047: '=' : 間接参照のレベルが 'FILE *' と 'int' で異なっています。 c:\users\yamaomoto\documents\visual studio 2008\projects\popen\popen\popen.c(14) : warning C4013: 関数 'pclose' は定義されていません。int 型の値を返す外部関数と見なします。 popen.obj : error LNK2019: 未解決の外部シンボル _pclose が関数 _main で参照されました。 popen.obj : error LNK2019: 未解決の外部シンボル _popen が関数 _main で参照されました。 C:\Users\Yamaomoto\Documents\Visual Studio 2008\Projects\popen\Debug\popen.exe : fatal error LNK1120: 外部参照 2 が未解決です。 色々と試してみたのですが解決に至りませんでしたのでよろしければ、 教えて頂けませんでしょうか?

  • c#でC言語のstrtokに相当する関数は何か

    文字列から指定した文字でデータを区切る関数strtokがC言語にはある これに相当するC#の関数は何か 例えばCでは以下のように書く。 char data1[]= " 123 , 456 Yamada " ; char *token ; strtok( data, " ," ) ; /* スペースとカンマを区切りに文字列を抽出 */ token = strtok( str, " ." ); printf(" token chat = %s\n", token ) ; while ( token != NULL ) { token = strtok( NULL," ." ); if ( token != NULL ) printf(" token chat = %s\n", token ) ; } これに相当するc#のSplit関数を使用すると 不要な空白を取り出しているようである 知っている方がおりましたら、教えて下さい。

  • 助けてください。困っています

    初めまして 課題でメイン関数(メインメニュー)から呼び出されるサブシステムの「かな氏名検索」を作っているのですが、 自分なりに頑張ってみたものの全くの初心者のため完全に行き詰ってしまい、どこが悪いのかもわからない状態です。 なので、皆さんに教えて頂きたいと思い、 お願いにまいりました。 100人分のデータから「ふりがな」を部分一致で検索して、一致した人のデータを表示させるもので、 探すデータ(社員データ)はカンマ区切りテキストで 社員番号 名前 ふりがな 郵便番号 住所 電話番号 生年月日 入社年月日 役職コード 所属コード 性別 の順に 0523,鈴木一郎,すずきいちろう,105-0000,東京都どこどこ, ,19830101,20090404,01,01,M のように入っています。空白部には半角スペースが入ってます。 現在の自分で作ったソースは #include <stdio.h> #include <string.h> #include "CFUNC.h" #include "display.h" #define NUM 200 typedef struct shain{ char id[5]; char name[21]; char hurigana[31]; char yubin[9]; char jusyo[101]; char tel[14]; int birth; int nyusya; char yakusyokucode[3]; char syozokucode[3]; char seibetsu[2]; }shain; int main(void) { int j; int i; int cnt = 0; shain data[100]; FILE *fp; char *token; char s[NUM]; char mes[25] = "該当する結果がありません"; char mes2[30] = "該当するメニューがありません"; char str[30]; fp = fopen("shain.txt","r"); if(fp==NULL){ printf("ファイルオープンに失敗しました。\n"); return 1; } for(i=0; i<100; ++i){ fgets(s,NUM-1,fp); token= strtok(s, ","); /* str1の分割(1回目) */ strcpy(data[i].id,token); token = strtok(NULL, ","); strcpy(data[i].name,token); token = strtok(NULL, ","); strcpy(data[i].hurigana,token); token = strtok(NULL, ","); strcpy(data[i].yubin,token); token = strtok(NULL, ","); strcpy(data[i].jusyo,token); token = strtok(NULL, ","); strcpy(data[i].tel,token); token = strtok(NULL, ","); data[i].birth =(int)token; token = strtok(NULL, ","); data[i].nyusya=(int)token; token = strtok(NULL, ","); strcpy(data[i].yakusyokucode,token); token = strtok(NULL, ","); strcpy(data[i].syozokucode,token); token = strtok(NULL, "\n"); strcpy(data[i].seibetsu,token); } cls(); /*検索画面*/ printf("*****************************************************\n"); printf("[かな氏名検索]\n"); printf("かなを入力してください:\n"); printf(" \n"); printf(" \n"); printf(" 0:メニューに戻る\n"); printf("*****************************************************\n"); printf("メッセージ:\n"); for(;;){ setLocate(24,3); scanf("%s",str); if(strcmp(str,"0")==0){ break; } for(i=0; i<100; ++i){ if(strncmp(str,data[i].hurigana,5)==0){ cnt++; if(cnt==1){ /*検索結果画面*/ printf("*****************************************************\n"); printf("[かな氏名検索結果]\n"); printf("社員番号 氏名  ふりがな  入社年度  所属  性別 役職\n"); printf(" %s  %s  %5s %d %s %s %s %s\n",  data[i].id,data[i].name,data[i].hurigana,data[i].nyusya,  data[i].syozokucode,data[i].seibetsu,data[i].yakusyokucode); } else{ printf(" %s  %s  %5s %d %s %s %s %s\n", data[i].id,data[i].name,data[i].hurigana,data[i].nyusya, data[i].syozokucode,data[i].seibetsu,data[i].yakusyokucode); } } //見たつからなかった時 if (cnt==0){ setLocate(12,8); printf("%s\n",mes); } //メッセージ setLocate(24,3); scanf("%s",str); setLocate(12,8); printf("%s\n",mes); } } printf("\n"); fclose(fp); return 0; } 所々変なところもあり見にくいと思いますが、 とりあえず単独で検索だけしっかり出来るようにしたいです。 検索は1回だけでなく、何回も出来るようにしたいです。 下手な文章のうえ長文でまことにすいませんが、よろしくお願いします。

  • UNIX関数?(popen)について

    Cプログラムでpopen関数?を使用しコマンド(rcp)を実行するプログ ラムを造ったのですが、当分が動作していたのですが、何のタイミングか分からないのですが、失敗する時が有ります。一度失敗するとそれ以降はずーと失敗します 。どのような原因が考えられるのでしょうか? ちなみにプログラムの一部をとりあえずのせておきます。(ファイル名及び相手先 のディレクトリ名は現状存在します) 又、system関数とpopen関数の大きな違いは何でしょうか? ご教示お願い致します。 (cプログラムの一部) char buff[256] ; char cmnd[256] ; /* コマンド文字列 */ int fp_rtc ; memset( buff, NULL, sizeof(buff) ) ; memset( cmnd, NULL, sizeof(cmnd) ) ; strcpy( buff, argv[1] ) ; sprintf(cmnd, RCP_FMT , buff, RCP_DIR, buff ) ; printf( "rcp cmnd ( %s )\n", cmnd ) ; fp = popen(cmnd, "r") ; fflush(stdout) ; fp_rtc = pclose(fp) ; if ( fp_rtc != 0 ){ printf( "pclose err [ rtc:%d ] \n", fp_rtc ) ; }

  • C言語でファイルの内容を strtok関数 を使って数字と文字を分けて

    C言語でファイルの内容を strtok関数 を使って数字と文字を分けて配列に格納したいのですが、うまくできません。 どこが駄目なのかご指摘をお願いします! ファイル内容 20 田中 10 鈴木 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char str[256]; char *tp; int i=0; int num[10]; char na[10]; fp=fopen(argv[1],"r"); while(fgets(str,sizeof str,fp)!=NULL); tp = strtok ( str, " " ); while(tp != NULL ) { num[i]=atoi(tp); tp = strtok( NULL," "); if ( tp != NULL ){ na[i]=*tp; } i++; } printf("%d\n%s",num[0],na[0]); printf("%d\n%s",num[1],na[1]); fclose(fp); return 0; }

  • 次のソースの使い方(strtok()関数)

     次のソースプログラムについてです。 (“□”は、タブを表します) ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ #include <stdio.h> #include <stdlib.h> /* EXIT_SUCCESS */ #include <string.h> /* strtok() */ int main(void) { □int i, n; □char str[10], *token1, *token2; □scanf("%d", &n); □for (i=0; i<n; i++) { □□scanf("%s", str); □□token1 = strtok(str, ","); □□token2 = strtok(NULL, ","); □□printf("hello = %s , world = %s\n" ,token1 ,token2); □} □return EXIT_SUCCESS; } ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆  これを実行すると、入力待ち画面になって、何を入力すれば何が得られるのか、てんで分からないのですが、どなたか、このプログラムの使い方と意味について、解説をお願いします。  ちなみに、“1”を入力した後、[Ctrl]+[c]で抜けると、結果は、 ◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ hello = ヒヒz@俳・, world = (null)◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆◆ となりました。

  • トークンで分けた文字列をさらにトークンで分ける

    初心者です。よろしければご教授下さい。 temp.c:12: warning: useless keyword or type name in empty declaration というような文字列がg_str02[0]に格納されている時に、まずは「 」(半角スペース)を区切り文字としてトークンごとに分け最初の2つのトークンをmretsu1[0]とmretsu1[1]の中に格納し、さらにmretsu1[0](上記で言う「temp.c:12:」)を「:」を区切り文字としてトークンごとに分けmretsu2[0]とmretsu2[1]に格納するような関数を作りたいのですが、コンパイルは成功するのですが、できた実行ファイルを実行するとエラーが起きて強制終了されてしまいます。 現在ソースは以下のようになっています。 ////////// char mretsu1[255][255]; char mretsu2[2][255]; char *token1 = " "; char *token2 = ":"; strcpy(mretsu1[0], strtok(g_str02[0], token1)); strcpy(mretsu1[1], strtok(NULL, token1)); strcpy(mretsu2[0], strtok(mretsu1[0], token2)); strcpy(mretsu2[1], strtok(NULL, token2)); ////////// デバッグをしてみた所、どうもmretsu1[0]をさらに分解しているところにエラーがあるようです。 よろしくお願いします。

  • ファイル読み込みとmap処理

    Visual C++ 2008 Express Edition 環境です。 入力テキストファイルを読み込み、空白で単語を区切り、単語すべてをmapにいれるという処理のプログラムを書こうとしています。 perlでいうところのsplit, 配列へのpushをC++でstrtokとmapでならかけると思いました。 入力ファイルは input1.txt--------------- cat dog mice human mosquito beetle spider ------------------------- プログラムは #include <stdio.h> #include<iostream> #include <map> #include <vector> int main( ) { FILE *input_file1; input_file1 = fopen("input1.txt", "r"); char str[256]; char *token; std::vector<char *> my_vector; // while (fgets(str, 256, input_file1) != NULL) { token = strtok( str , " " ); while( token != NULL ){ my_vector.push_back(token) ; printf("%s\n",token); token = strtok( NULL , " " ); } } printf("starting vector loop\n"); std::vector<char *>::iterator it = my_vector.begin(); // while( it != my_vector.end() ) // { printf("%s\n",*it); ++it; // } fclose(input_file1); return 0; } というふうにしました。 cat dog mice human mosquito beetle spider というような出力がなされるものと思ったのですが、実行してみると mapを使ったループ(全要素)出力は mosquito uito le mosquito beetle spider というふうに出力されてしまいます。 strtokで単語を分ける部分は問題なく出力で確認できるので、問題はmapの作り方やポインタだと思うのですが原因がわかりません。 問題点、解決策がお分かりになる方、よろしくお願いします。

  • C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問

    C言語で、ファイルを読み込んで数字と名前に分けて配列に格納に関する質問です! ファイルを開いた後でエラーとなるのですが、何が足りないのでしょうか? ファイル内容 20 田中 10 鈴木 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(int argc,char *argv[]) { FILE *fp; char str[256]; char *tp; int k,i=0; int num[10]; char na[10][20]; fp=fopen(argv[1],"r"); if(fp==NULL){ printf("ファイルを開けません\n"); return 1; }else{ printf("開けた\n"); } while(fgets(str,sizeof str,fp)!=NULL){ tp=strtok(str," "); num[i]=atoi(tp); tp=strtok(NULL," "); strcpy(na[i],tp); i++; } printf("%d\n%s\n",num[0],na[0]); printf("%d\n%s\n",num[1],na[1]); fclose(fp); return 0; }

専門家に質問してみよう