外出自粛中でも楽しく過ごす!QAまとめ>>

perl初心者です。すごく困っています。
perl上の数値をcプログラムで呼び込んで処理して処理結果をperlに返す、という処理がわからず困っています。誰か教えていただけませんか?

具体的にはperl上での社員の名簿のID(数字)をcでe-mailアドレスにしてperlに返すという感じです。

よろしくお願いします。

A 回答 (4件)

perlから実行モジュールを呼び出し、実行モジュールが標準出力に、出力した内容を、perl側で取得することができます。

OSが不明なので、とりあえずWindowsでの例です。
perl側
$result = `test.exe`;
printf ("RESULT=<%s>\n",$result);

C側( 実行モジュールはtest.exe)
#include <stdio.h>
void main(void)
{
printf ("This is a pen");
}

perlのスクリプトを実行すると
RESULT=<This is a pen>
得られます。
    • good
    • 0

open でパイプ


system( 'command' )
`command`

のどれかになると思うんだが。
    • good
    • 0

Cの方のプログラムは、どんなインターフェースになっているのですか?


DLLとかコマンドの引数で渡すとか?

私も、質問文の処理程度ならPerlでできると思います。
そのCのプログラムを補足でアップすることはできますか?
    • good
    • 0

Cのプログラムの呼び出しは、system()を使えばよいとは思いますが、それよりは、


perlで全部処理してしまう方がいいのでは?と思えます。
    • good
    • 0

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

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QPerlソースコードをコンパイルすることはできないのでしょうか?

Perlはインタプリタ言語とされますが、実行の際には機械語に翻訳されているのでしょうから、機械語のコードをオブジェクトファイルとして保存して、そのまま使うことはできないのでしょうか?
そうすれば実行するときに翻訳する必要がなく、実行速度が多少上がるのではないかな、と思いました。
直接関係のない関連事項でも、宜しくお教えください

Aベストアンサー

http://aspn.activestate.com/ASPN/docs/ActivePerl/5.8/lib/Pod/perlrun.html
Perl のコマンドラインオプション -u を指定するとスクリプトをコンパイル後コアダンプします。
undump コマンドを使ってcore ファイルから実行ファイルが作成できるというようなことが上記サイトの説明として載っています。

あと、ツールでPerl2exe というのもあるらしいです。

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

Qperlでc言語の実行処理を行いたい

perlでcのプログラム処理を行いたいのですが可能でしょうか。

内容としては、

複数のファイルをcのプログラムによって別のファイルにアウトプットする形にしたいと思っております。

よろしくお願いします。

Aベストアンサー

ファイル名や引数に法則性があればファイル一覧の取得などで簡便に書ける可能性もありますが、詳細が不明なのでとりあえず力技で。

use strict;
use warnings;

while(<DATA>) {
chomp;
my($filename, $p) = split /\s+/;
system("./a.out -P $p -i ${filename}.wav -o ${filename}.cep");
}
exit;

__DATA__
test1_1 256
test2_1 500

QLinuxサーバーが突然再起動した原因について

こんにちは。
教えてください。

自宅のLinux(Ubuntu)PCを数日間動かしていたところ、
突然再起動しました。
(勉強用にWebサーバとしているため、電源入りっぱなしです。)
考えられる原因とその確認方法を教えてください。

まずは、私が確認した内容です。
 (1)messagesファイルに異常なログはない。
   ログを見るとシャットダウンしないで、いきなり電源が落ちて、
   即座に起動しているようです。
 (2)カーネルパニックにはなっていないようです。


こんなことってあるんでしょうか・・・

Aベストアンサー

>ちなみにローダでとめておいた場合に再起動したとすると、
>OSの動作は関係ないということがわかりますよね??

はい。もちろん、その間はOSは使えませんが。

>BIOS画面で試すと何かわかりますかね??

BIOS画面で放置し、電源断→電源導通になると大抵はOSが起動しています。
ローダで止めていたのと同じように、一応の切り分けができます。
というか、これぐらいのことが想像、想定できないと切り分けはできませんよ。

>BIOS画面とローダ画面だと同じでしょうか??

今回の事象においてOSに問題があるかどうかの切り分けができるという点では同じです。
BIOSとローダが同じものかと問われているなら、回答は「違います」です。

QC言語で一部perlを呼び出したいのですが。

C言語にて、一部をPerlのスクリプトを呼び出して
使用したいのですが、どうすれば良いかわかりません。
必要なものと、出来ればやり方を簡単に教えていただける
とうれしいです。

Aベストアンサー

No.1の補足の「Cとしての1つのプログラムにしてしまいたいです。」の意味が
よくわからないのですが、perl に与えるスクリプトファイルは、C のソースとは
別になっていてもいいのでしょうか?

もしそうなら、例えば以下のようなコードはどうでしょう?
これで、perl スクリプト x の実行結果を C に取り込めますが…
(PATH や例外処理などは省いてあります)

FILE *f;
f = popen("perl x", "r");
(getc などで結果を得る)
pclose(f);

Q教えて!perlから.exeファイルを実行できますか?

初心者です。
perlから.exeファイルを実行できますでしょうか?
教えてください。
お願いします。

Aベストアンサー

> まず、Your_IP=127.0.0.1を出力して、
> 次、メモ帳を開いて、メモ帳を閉じたら、
> 次、Your_IP=127.0.0.1を再出力

`C:/windows/notepad.exe`;
で呼ばれるのはサーバーにあるファイルです。
クライアントにあるファイルは当然呼べません。
(そんなことができたら何をされるか分かったものじゃありません)
よって、サーバーとクライアント間で、クライアントからこのスクリプトを呼んだ場合、メモ帳はサーバーにあるメモ帳が呼ばれます。
で、クライアントはサーバー上で開いたメモ帳を閉じることはできないので、タイムアウトになるまで終われなくなるはずです。
当たり前ですが、サーバーがWindowsでなければメモ帳はないので、Unix等他のOS上のサーバーの場合は、
`C:/windows/notepad.exe`;は動かずそのままスルーします。

改行されないのはtext/htmlと吐いているからです。
(HTMLとして吐いているので、<br>タグがなければ改行されない)
ブラウザで「ソースを開く」をやればソース上では改行されています。
あと、\r\nではなく\nだけで構いません。

> まず、Your_IP=127.0.0.1を出力して、
> 次、メモ帳を開いて、メモ帳を閉じたら、
> 次、Your_IP=127.0.0.1を再出力

`C:/windows/notepad.exe`;
で呼ばれるのはサーバーにあるファイルです。
クライアントにあるファイルは当然呼べません。
(そんなことができたら何をされるか分かったものじゃありません)
よって、サーバーとクライアント間で、クライアントからこのスクリプトを呼んだ場合、メモ帳はサーバーにあるメモ帳が呼ばれます。
で、クライアントはサーバー上で開いたメモ帳を閉じることは...続きを読む

QDOSコマンドで、標準出力を出力しないようにするには?

Windowsのバッチファイルでコマンドを実行する際、標準出力をディスプレイに表示したくないのですが、どのようにするのが、一般的なのでしょうか?
CDで実行するので、ファイルに出力はしたくありません。
UNIXとかだと、nullにパイプするようなのですが…。

Aベストアンサー

>UNIXとかだと、nullにパイプするようなのですが…。

リダイレクトですね。

同様です。
標準出力だけなら「c:\> command > nul」
エラー出力もなら「c:\> command > nul 2>&1」

QCan't use string ("0") as an ARRAY ref の原因について

Perl 5.6を使っております。
Perlで原因不明なエラーに直面して困っております。
Can't use string ("0") as an ARRAY ref while "strict refs"
というエラーが発生しているのですが
これは良くあるミスとして何が原因でしょうか?

Aベストアンサー

No.2です。書き漏らしてましたが、エラーメッセージの内容がよくわからない時は

use diagnostics;

しましょう。

Qperlによる外部プログラムの実行

perlにてCGIを作成しています。
ブラウザでCGIにアクセスしたとき、gpgというコマンドプロンプトの
プログラムを実行したいと考えており以下のようなプログラムを作成しました。
test.batを単体で実行したときにはうまく動作するのですが、CGIを介して
実行するとうまくいきません。


CGIのプログラム (WriteCmd.cgi)
**********************************
 #!c:/Perl/bin/perl
 print "Content-type: text/html\n\n";
 print "test.batの実行\n<br>";
 system("test.bat");
 exit;
**********************************


test.bat
**********************************
 gpg --batch --gen-key sample.txt
**********************************


またtest.batの内容を
**********************************
 mkdir test
**********************************

としてみるとディレクトリがちゃんと作成できるので
WebサーバやPerlのパスの問題ではないと考えております。
よい解決方法がありましたら教えていただけると助かります。
よろしくお願いします。

perlにてCGIを作成しています。
ブラウザでCGIにアクセスしたとき、gpgというコマンドプロンプトの
プログラムを実行したいと考えており以下のようなプログラムを作成しました。
test.batを単体で実行したときにはうまく動作するのですが、CGIを介して
実行するとうまくいきません。


CGIのプログラム (WriteCmd.cgi)
**********************************
 #!c:/Perl/bin/perl
 print "Content-type: text/html\n\n";
 print "test.batの実行\n<br>";
 system("test.bat");
 exit;
*********...続きを読む

Aベストアンサー

system("test.bat"); を バッククォート(shift+ @キー)に変えて
`test.bat`;   ならどうでしょうか?

それでも駄目ならgpgをフルパスで記述するとかしたらどうでしょうか?

Qファイル出力の場所を指定

現在C++にてhtmlファイルを出力するプログラムを作っているのですが、出力場所を指定することはできるのでしょうか?(現在はそのプログラムソースが保存されている場所と同じファイル内に出力されますが、それをデスクトップに出力するなど。)
もし、方法がありましたら、教えてください。
ソースや参考HPのURLなどのせていただけたらありがたいです。
環境はVisualStudio.NET2003です。
よろしくお願いします。

Aベストアンサー

単にファイル名の前にパスを指定する。

絶対パス指定
fp=fopen("c:/temp/test.txt","w");

相対パス指定
fp=fopen("./hoge/test.txt","w");


デスクトップはOSやユーザによって場所が異なるので、少し面倒です。
XPの場合環境変数を利用してこんな感じで出来ると思います。

例:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void main(void)
{
FILE *fp;
char fname[1024];
strcpy(fname,getenv("USERPROFILE"));
strcat(fname,"/デスクトップ/test.txt");
fp=fopen(fname,"w");
//処理
fclose(fp);
}


人気Q&Aランキング