- ベストアンサー
Perl初心者です。 ls -1 Outputの読み込みはどのように?
FreeBSD 上でディレクトリー内にあるファイル名を変数として読み込みたいのですが。 具体的には ls -1 *.defでアウトプットされるファイル名を@filne_nameに保存したい。 どなたか、教えてください。 よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
一般的な例を示します。 ここから----------------------------------------------- #!/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コマンドのパイプ処理機能を使って自身のプログラムに結果を与える為、コマンドの最後に「|」を付けます。
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
ファイル名取得の別解です。 組み込み関数 glob を使って @file_name = glob '*.def'; で、ワイルドカードにマッチするファイルのみを@file_nameに 取り出せます(パスをつけた指定も可能です)。 改行もついていませんので取り除く必要もありません。 グロビング演算子(<>) を使って同じことができますが、 この演算子の使用は現在では推奨されていません。
お礼
ご丁寧にありがとうございました。
- hiroaki101
- ベストアンサー率81% (97/119)
こんにちは。 ただファイル名を取得できればいいのなら、以下の方法もあります。 # *.defがファイル名右端である場合(そうでない場合、正規表現に"$"は不要です) if (opendir(DIR, '/dir_a/dir_b')) { @filne_name = grep { /\.def$/i && -f "$dir/$_" } readdir(DIR); closedir(DIR); } シェルとlsコマンドを起動しない分、負荷が比較的軽いと思います。御質問では「"ls -l *.def"の出力」と指定されていますので該当しないかもしれませんが、御参考までに申し上げました。下記URLにも丁寧に説明されています。
お礼
ご丁寧にありがとうございました。
- shuyamakawa
- ベストアンサー率67% (111/164)
コマンドをバッククォート「`」で囲んで使用すると、 出力結果を取り出せるので、それを加工します。 (下の例は、*.defにマッチするファイルが1個も無い場合を考慮していません) >perl -e '@file_name = split( /\n/, `ls -1 *.def` ) ; print join( "|", @file_name )' 00.def|05.def|svssh.def
お礼
>shuyamakawaさん どうもありがとうございました。
お礼
>ralf124cさん どうもありがとうございました。