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ブラウザ上からなら実行可能なスクリプトがコマンドラインだと実行しません

ブラウザ上からなら実行可能なスクリプトがコマンドラインだと実行しません
windowXP, perl5 で開発しています。

簡単なプログラム(test.pl)なのですが
-----
#!/usr/bin/perl
use IO:Socket
メール送信処理
1;
-----

ブラウザ上から実行すると正しくメール送信されますが、
これをコマンドプロンプトから
-----
perl test.pl
-----
とすると、

Can't locate IO/Socket.pm

と出てしまいます。
pathが通ってないとか絶対パスとかそのあたりかと思い、
socket.pmのあるパスを通したりしましたが、変化しません。

use IO::Socket

を絶対パスとかで指定するのでしょうか?
解決方法をお教え頂ければと思います。
よろしくお願い致します。

Aベストアンサー

とりあえず path は関係ないし, 実は「何が悪いのか」はメッセージの中に書いてあるんだけど.... メッセージはちゃんと読んで理解してください.
その perl はどのようにインストールしたのですか?
「ブラウザ上から実行する」とは, 具体的にはどのように「実行する」のですか? Webサーバが起動しているなら, それはなんですか?
「ブラウザ上から実行する」ときと「コマンドプロンプトから実行する」ときとで同じ perl が動いていることは確認できていますか?

Qforeach (1..4){ 英文字$_→$新しい変数として使いたい

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = "a$_";
print <<"HTML";
$view<BR>

HTML
}

の時、$viewに$a1~$a5の値を表示させるようにしたいのですが、上記の場合ですとa1~a5として表示されます。

foreachで$_で順に数字をaと組み合わせて出来た文字列を変数として使い、元々指定してある値を取得するようにしたいのです。

どのようにすれば解決できますでしょうか。ご掲示頂けましたら幸いです。

Aベストアンサー

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = ${"a$_"};
print <<"HTML";
$view<BR>

HTML
}

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Q@の配列変数ではなく$のスカラー変数でデータを取り込みたい

prel作成中で壁にぶつかってしまったので質問させてください。

以下のプログラムでdata.txtのデータを$dataに読み込みます。

$datfile = "./data.txt";
open(IN,"<$datfile");
$data = <IN>;
close(IN);

data.txtのデータは以下のものが入ってます。
---------------
田中
石田
佐藤
---------------

@dataとすると取り込み出来るのは分かったのですが、どうしても$dataでとりたく思ってます。

上記のスクリプトの場合は、先頭の行の「田中」のみ格納されてしまってます。

改行されていても、1つの変数として取り扱いたいです。

不足している内容があるかもしれません。

すみません。よろしくお願いいたします。

Aベストアンサー

$data = do {local $/ = undef; <IN> };

こう書けば、他の所の$/には影響しないです。


おすすめ情報