ウォーターサーバーとコーヒーマシンが一体化した画期的マシン >>

system から得た情報を変数に入れるには、どうしたらよいでしょうか。

$ls = system("ls -l");
これをスクリプトの中に置いてコマンドライン上から実行すると、そのまま、lsの結果が表示されてしまいました。

$ls は 0 を返します。

どうしたらよいのでしょうか。

A 回答 (1件)

OS環境が書かれていないのでちょっと自信ありませんが、


Windows 用の ActivePerl と Jperl で確認しました。
----------
system() を使わずに、
  $ls = `ls -l`; (←逆シングルクオートで囲む)
というのはどうでしょう?
これで、ls -l の結果を $ls に入れることができます。

ただし、最後の改行もそのまま入ってくるので、これを取り除きたい
場合は、
  chop ($ls = `ls -l`);
とすれば、うまくいきます。

コマンド実行の結果(正常/異常)も知りたい場合は、
この後で $? 変数を参照すればいいでしょう。試しに

  chop ($ls = `ls -l`);    ←パスをいろいろ変えてみて…
  print "---\n",$ls,"---\n";
  print "Status $?\n";

で、やってみて下さい。
    • good
    • 0
この回答へのお礼

うまく値を得ることができました。
ありがとうございます。
とても助かりました。

お礼日時:2001/07/15 07:16

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

このQ&Aを見た人はこんなQ&Aも見ています

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

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

Qperl system関数 引数 フォルダ

perlのsystem関数を使って、コマンドを実行したいのですが、
実行ファイルの引数にフォルダを指定すると、うまく動作しません。

以下のように書いています
system "実行ファイル フォルダ";

実行ファイルは .BATファイルで、
指定しているフォルダには複数のテキストファイルが入っています。
perlで書いたcgiファイルは実行ファイルと同じディレクトリにあります。
コマンドからではなく、手動でドラッグ&ドロップすると正常に動作します。
windous7でperlはActivePerlを使用しています。


引数にはフォルダを指定できないのでしょうか?
またフォルダを指定できない場合、解決策などはあるのでしょうか?

よろしくおねがいいたします。

Aベストアンサー

> しかしブラウザに
(略)
> が表示されてしまいます。

それは、バッチファイルが出力したものでしょう。
バッチファイルが出力したものも、CGIの出力に混ざってしまいます。
Perl側で対応する場合は、
system '… > nul'
としてください。
あるいは、バッチファイル側で、1行目に
@echo off
という行を追加してもいけるかと思います。

QPerl 内で実行される Perl が STDOUT に吐いたものを変数で受け取りたい

 凄い不思議な質問タイトルになってしまいましたが……(笑)

 下記のようなソースを実行したとします。

-------------------------○ source.pl
open(IN, "<dest.pl");
foreach(<IN>){$s.=$_;}
close(IN);
eval($s);

 このとき、source.pl で実行される dest.pl には別の Perl プログラムが入っています。
 で、dest.pl の内部にはいくつかの print ""; があって、標準出力をおこなっているわけですが、この標準出力結果を画面には出さず、source.pl 側で受け取る事はできないもんでしょうか。

  @r = `dest.pl`;

 という方法もあるとは思うんですが、なんとか eval でやりたいのです。

 なんかパイプとか繋ぎなおせば何とかなりそうな気もするんですが……。
 何かご存知の方がいらっしゃいましたら、よろしくお願いします。

Aベストアンサー

子プロセスでevalし、その出力をpipeで読んではどうでしょうか。

if (open IN, "dest.pl") {
  local $/;
  $s = <IN>;
  close IN;
}

pipe RDP, WRP;

if (my $pid = fork) {  # 親
  close WRP;
  chomp(@r = <RDP>);
  close RDP;
  wait;
}
elsif (defined $pid) {  # 子
  close RDP;
  select WRP;  # 標準出力を WRP に変更
  $| = 1;      # バッファリングを止める
  eval($s);
  close WRP;
  exit;
}
else { die $! }  # fork失敗

foreach (@r) {
  print "$_\n";
}

QPerl エラーログを指定の場所に出力する場合

以下のよーに指定すればエラーログの場所を指定する事ができますが、

# エラーログ
BEGIN{ open ( STDERR, ">>./log/err_log/err.txt" ); }

たとえば変数にファイル名を入れて指定する場合は、

$err_log = "./log/err_log/err.txt";
BEGIN{ open ( STDERR, ">>$err_log" ); }

とするとエラーが出てしまいます。変数に入っているものを指定するにはどうすればいいでしょうか?

Aベストアンサー

BEGINブロックは一番最初に実行されます。
この場合、$err_log = "./log/err_log/err.txt"; より前です。
なので、open時の$err_logは空です。

$err_log=をBEGINブロックに入れるか、openをBEGINブロックから出すか、になります。

QPerl変数から外部プログラムの標準入力へ

Perlのプログラム内部で保持している変数の値をシェルコマンドに与える方法はありますか?

$value=12345;
や、
@array=('ONE', 'TWO', 'THREE');
などの変数の値を外部コマンド(標準入力を受けることができるコマンド)に渡したいのです。

方法がわからないので、現在は一度ファイルに書き出して、
system('cat file.name | command');
のようにして渡しています。なんか賢くない書き方のような気がするのですが。

Aベストアンサー

> system('cat file.name | command');

こうするくらいなら、こうのほうがましかも。
system("command $value");
# or `command $value`

ただし、どれも汚れた値は扱えない。
(open & printだとどうなんだろう?sh使ってないからok?)

>open(FILE, "| /my/command |");

perlipc(Perl のプロセス間通信)の日本語訳を参考URLに上げておきます。
(双方向通信はやったこと無いけど、socketpairが無難なのかな?)

参考URL:http://www.kt.rim.or.jp/~kbk/perl5.005/perlipc.html#Bidirectional_Communication_with

QPerlで環境変数を設定するには

あるPathを環境変数として設定したい場合、
例)TNS_ADMIN=D:\Test\exe

たとえばMS-DOSなら、
set TNS_ADMIN=D:\Test\exe
と設定しますよね。

これと同じことをPerlでどうやればいいのかというのが質問です。

ENVモジュールを使って、
$ENV{TNS_ADMIN}=D:\Test\exe
としてみたものの、Perlを実行した後に確認してみるとセットされていないようでした。
(確認方法はPerlを実行したDOSプロンプトにて"set"を実行)

よろしくお願いします。

Aベストアンサー

>>破棄された後に確認しても、わかりません。
>どうにかその環境変数がセットされていることを確認する方法ってないのでしょうか?

perlで子プロセスを起動すれば確認できます。

例えば、NT系のOSであれば...

次のスクリプトを用意。
#!c:\perl\bin\perl.exe
$ENV{"TNS_ADMIN"}="D:\\Test\\exe";
system("cmd");

それを実行すると、コマンドプロセッサが表示されるので、
set[return]
すれば、子プロセスの環境変数が確認できます。
確認後、exit[return]すると、子プロセスが終了するので、
親プロセスたるperlも終了する。

Q○文字目に文字挿入

お世話になっています。
正規表現の文字置換s///gを使って数字の3桁目に-を挿入したいですが、どうしたらいいのかわかりません。

どなたか教えていただけないでしょうか。

5770001

577-0001

にしたいのでしが…

Aベストアンサー

試してないのですが
s/(.{3})(.*)/$1-$2/;
でよいはずです。

数字確定ならば\dでも可。

Q二次元配列における要素数のはじき出し

普通、配列の要素数を出すとき
$num = @list;
で良いですよね?
ですが、二次元配列で、
$num = @list[1];
って形にするとエラーになります。

どうすればいいのでしょうか?

Aベストアンサー

$num = @{$list[1]};
二次元配列は普通の配列に、配列のリファレンス(C言語で言うポインタのようなもの)が並んでいるものなので、これを解釈してやる必要があります。
$list[1]が配列のリファレンスとなっているので、@{$list[1]}としてやることで、配列の形に戻します。

Qperlでawkのようなことはできるでしょうか?

perlなど初心者です。
awkでレコードのフィールドを$1、$2などと参照できるのが便利だなと感じているのですが、perlでもコマンドラインで同じ事をするにはどうすればよいでしょうか?

Aベストアンサー

コマンドラインオプション -a (と-F)を使います。

perldoc perlrun
すると細かい説明がわかります。
-a
turns on autosplit mode when used with a -n or -p. An implicit
split command to the @F array is done as the first thing inside the
implicit while loop produced by the -n or -p.

perl -ane 'print pop(@F), "\n";'

is equivalent to

while (<>) {
@F = split(' ');
print pop(@F), "\n";
}

An alternate delimiter may be specified using -F.

@F という配列に入力行を分割して格納します。
awk でいうところの print $1, $2 は
print $F[0], $F[1], "\n";
になります。
配列が0オリジンになることに注意してください。
awkでの$0は、この場合は $_ という変数に入っている値になります。

コマンドラインオプション -a (と-F)を使います。

perldoc perlrun
すると細かい説明がわかります。
-a
turns on autosplit mode when used with a -n or -p. An implicit
split command to the @F array is done as the first thing inside the
implicit while loop produced by the -n or -p.

perl -ane 'print pop(@F), "\n";'

is equivalent to

while (<>) {
@F = split(' ');
print pop(@F), "\n"...続きを読む

Qファイルからデータを読み込んで、配列に格納する方法

データファイル grep.dat があり、その中は
12345
67890
ABCDE
(EOF)
となっています。
 
このファイルの中身を読み込んで、配列 P[0]の
中に("12345","67890","ABCDE") に格納したい
のですが、どのように記述すればよいでしょうか。

Aベストアンサー

多次元配列に代入する場合

my @p;
open FILE, "grep.dat";
  @{$p[0]} = <FILE>;  ・・(a)
close FILE;

openの書式などは好みで変えてください。
結論を言えば、(a)のように書けばokです。

#細かい書式は他にもありますので調べてみるといいかもしれません。

Qシェルスクリプト+perl

シェルスクリプト中で1行だけperlを利用したいと思っています。
しかしシェルスクリプトで利用している変数をperlに持っていく方法が分からず悩んでいます。

----------------------
#!/ban/bash
hoge="hogehoge"
perl -e ・・・ ←この中で$hogeを利用したい
----------------------

perlですべて書き直せばできるのですが、1行のためだけに、すべてを修正するのもどうかと思いましたので質問させていただきました。
もしご存知の方いらっしゃいましたらお教えください。

Aベストアンサー

hoge="hogehoge"
perl -e "print \"$hoge\";"
とか
perl -e '$a=1;print $a . "'"$hoge"'";$a=2;...;'
とか


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング