• ベストアンサー

Perl初心者です。 ls -1 Outputの読み込みはどのように?

FreeBSD 上でディレクトリー内にあるファイル名を変数として読み込みたいのですが。 具体的には ls -1 *.defでアウトプットされるファイル名を@filne_nameに保存したい。 どなたか、教えてください。 よろしくお願いします。

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

  • ベストアンサー
  • ralf124c
  • ベストアンサー率52% (232/446)
回答No.1

一般的な例を示します。 ここから----------------------------------------------- #!/usr/local/bin/perl ## コマンドを定義:パイプ処理のため末尾に「|」を付ける my $CMD = 'ls -1 *.def|'; ## コマンドを実行して配列「@filne_name」に結果を得る open(IN01,$CMD); my @filne_name = <IN01>; close(IN01); ## 確認のため内容を表示 print @filne_name; ここまで----------------------------------------------- ここではPerlウンヌンではなく、OSコマンドのパイプ処理機能を使って自身のプログラムに結果を与える為、コマンドの最後に「|」を付けます。

sjc95134
質問者

お礼

>ralf124cさん どうもありがとうございました。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

ファイル名取得の別解です。 組み込み関数 glob を使って @file_name = glob '*.def'; で、ワイルドカードにマッチするファイルのみを@file_nameに 取り出せます(パスをつけた指定も可能です)。 改行もついていませんので取り除く必要もありません。 グロビング演算子(<>) を使って同じことができますが、 この演算子の使用は現在では推奨されていません。

sjc95134
質問者

お礼

ご丁寧にありがとうございました。

回答No.3

こんにちは。 ただファイル名を取得できればいいのなら、以下の方法もあります。 # *.defがファイル名右端である場合(そうでない場合、正規表現に"$"は不要です) if (opendir(DIR, '/dir_a/dir_b')) { @filne_name = grep { /\.def$/i && -f "$dir/$_" } readdir(DIR); closedir(DIR); } シェルとlsコマンドを起動しない分、負荷が比較的軽いと思います。御質問では「"ls -l *.def"の出力」と指定されていますので該当しないかもしれませんが、御参考までに申し上げました。下記URLにも丁寧に説明されています。

参考URL:
http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k03.htm
sjc95134
質問者

お礼

ご丁寧にありがとうございました。

回答No.2

コマンドをバッククォート「`」で囲んで使用すると、 出力結果を取り出せるので、それを加工します。 (下の例は、*.defにマッチするファイルが1個も無い場合を考慮していません) >perl -e '@file_name = split( /\n/, `ls -1 *.def` ) ; print join( "|", @file_name )' 00.def|05.def|svssh.def

sjc95134
質問者

お礼

>shuyamakawaさん どうもありがとうございました。

関連するQ&A

専門家に質問してみよう