• ベストアンサー

grepとsort

my $files = readdir(DIR); @files = grep { !/^\.\.?$/; } @files; 「.」と「..」の除去 @files = sort { $a cmp $b; } @files; ファイル名のソート この2文についてですが、grepとsortに関する文法がよくわかりません。 grepって、除去するコマンドなんでしょうか? sortでは、$a cmp $bが何を意味しているのでしょうか。

  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

grepは配列から指定条件に合う要素を抽出する関数ですが、抽出条件が否定形なので、除去する動きになってます。 cmpは文字列の大小関係を求める演算子です。関数sortは、配列の要素を、$aと$bに入れて比較しながら、ソートを行います。 詳しくは、Perlに標準添付されているドキュメントperlfuncをご覧下さい。

参考URL:
http://www.perldoc.com/
msndance
質問者

お礼

ありがとうございます。理解できました。実は僕、パールを動かせるUNIX環境をもっていません。 趣味でUNIXを全体的に説明している分厚い本を読んでいるのです。 で、本のうち2章分がパールの説明にあてられているのですが、grepとsortみたいな一つ一つの文に対する詳細な説明があまりなされていないものですから・・・すみません。

関連するQ&A

  • grepの書き方がわかりません。

    Perlの初心者なんですが、以下のようなテーマをもらってプログラムを作っています。  第一引数にディレクトリのパス、第二引数に検索し たいファイル名を指定して第一引数の  パス以下にある全てのディレクトリを検索してファイルがあればそのパスを表示させなさい。 一応できたのですがプログラムの記述の一部がよくわかりません。以下のプログラムは一部です。 local ($dir, $file) = @_; opendir(DIR,$dir) or die @data = readdir(DIR);#ディレクトリの内容を読む closedir(DIR);#ディレクトリを閉じる local @fname = grep {-f "$dir/$_"} @data; local @dname = grep {-d "$dir/$_"} @data; $dir,$fileには第一、第二引数の文字列をいれているのですがそのディレクトリになかにファイル、ディレクトリがないか検索するためgrepを使っています。それで"$dir/$_"の部分の意味がよくわかりません。 この部分は他のサイトであったものを流用しただけなのですがよくわからないまま使ってたまたま動いたから使用しててこのままでは理解していないままなので どうか教えてほしいです。 あともう一点ありましてgrepのところで最初自分で書いた時  local @fname = grep (-f,@data); というように書きました。ファイルが第一引数にあるときは問題なく動作するのですがその下にあるディレクトリにあるとなぜかプログラムが終わりません。 デバッグとして@dataの中身を表示したらそのディレクトリの検索をしてはいるんですが、その中に目当てのファイルがあるはずなのに@dataの中身がからっぽで ファイルがないことになっています。この違いがどうしてもわかりません。  以上の二点がわからないんですがどうかお手数ですがどなたか教えてください。  

    • ベストアンサー
    • Perl
  • ファイル名の変更

    下記はデレクトリーabcのjpg画像ファイル名を(数字.jpg) 読み込み順に(1.jpg)に変更するコードですが,エラーになります、 #!"C:\perl\bin\perl.exe" opendir(DIR,"./abc/"); # デレクトリopen @DATA = grep /\.jpe?g/i, readdir(DIR); # デレクトリread @SDATA = sort { $a cmp $b } @DATA; # ソート for ($k=0; $k<=@SDATA; $k++) { $new = $k.'.jpg'; rename ("$SDATA[$k]", "$new"); } closedir(DIR); exit; よろしくお願いします。

    • ベストアンサー
    • Perl
  • フォルダ内のファイル名取得の仕方が分かりません

    Apache2.0.47、PHP4.3.2で使用しています。 フォルダ内のファイル名の取得を以下のように書いています。 (scandirは使えませんでした) <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { $files[] = $filename; } sort($files); print_r($files); ?> "."と".."も取得されるので、以下のように変更したのですが同じ結果でした。 <?php $dir = "test_dir"; $dh = opendir($dir); while (false !== ($filename = readdir($dh))) { if(filename!=". "){ if(filename!=".. "){ $file[] = $filename; } } } sort($files); print_r($files); ?> "."と".."をはぶいたファイル名だけを取得したい場合にはどうすればよいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • grepについて

    Freebsdにおいてgrepというコマンドがあると思いますが、このgrepで特定の階層にある特定のファイルを探すことはできるのでしょうか? あるファイルの中に存在する、特定の文字などを検索するやり方は分かるのですがファイル名を検索しようとしても、やり方が分からずできません。 それとも、もともとgrepコマンドは、あるファイル内に存在する文字を検索するためのコマンドなのでしょうか?? その辺りも、よく分かりません。 他に、grepはこういう時に便利!!みたいな例があれば教えてくださいませ。 ご回答の程、よろしくお願い致します。

  • Perlの文字列ソートについて

    こんにちわ。 例えば、 あいう,2002/04/12, ななな,2002/04/14, あいう,2002/04/20, というlogがあったとして、これを表示させるときには、 あいう 2002/04/12 あいう 2002/04/20 ななな 2002/04/14 といった具合に出力させたいのですが、そのsortのさせ方がわかりません。 my @lines = sort by_no(@lines); sub by_no { my $no1 = (split(/,/,$a))[0]; my $no2 = (split(/,/,$b))[0]; $no2 cmp $no1; } ではどこがいけないのでしょうか? 教えてください。お願いします。

    • 締切済み
    • CGI
  • ファイル操作について

    別スレ立てているので、ルール違反になっちゃいますかね? もしそうであればゴメンナサイ… sub fanc{ my @array = @_; my $ag = shift @array; my $n1 = 'AAA.csv'; my $n2 = 'BBB.csv'; my $n3 = 'CCC.csv'; my $n4 = 'DDD.csv'; my $n5 = 'EEE.csv'; ・ opendir(DIR, "C:/Program Files/Apache Group/Apache2/cgi-bin/test");my @pairs = readdir(DIR); close(DIR); if($ag == 1){@files = grep(/$n1/,@pairs); } if($ag == 2){@files = grep(/$n2/,@pairs); } if($ag == 3){@files = grep(/$n3/,@pairs); } if($ag == 4){@files = grep(/$n4/,@pairs); } if($ag == 5){@files = grep(/$n5/,@pairs); } if($ag == 6){@files = grep(/$n6/,@pairs); } ・ $dfile1 = $files[0]; open(IN,"$dfile1") or exit; chomp(my $row01 = <IN>); chomp(my $row02 = <IN>); chomp(my $row03 = <IN>); chomp(my $row04 = <IN>); chomp(my $row05 = <IN>); chomp(my $row06 = <IN>); ・ close(IN); my @col01 = split(/,/, $row01); my @col02 = split(/,/, $row02); my @col03 = split(/,/, $row03); ・ ・ こういったコードをもっと短く、書くやり方を知りたいです。 grepでヒットするのが複数の場合もあるため、当初はForeach文とフOpenで配列@filesに入った ファイルを全て展開して、配列、又は変数に格納しようと思ったのですが、どうやって複数の配列をOpen関数で扱えばいいのか解りません。 もしそうでなければ、現在は一つのファイルに対しての処理ですが、残ったファイルに関しても関数を回す方法があれば、ご教授願えませんか??あ、あと、CODE(xxxxxx)ってなんのことでしょう?

    • ベストアンサー
    • Perl
  • grepの使い方

    "A.lst"と"B.lst"の2つのファイルがあります。 ともにディレクトリ階層の一覧が記述されています。 2つのファイルを比較して、A.lstのディレクトリ階層の文字列を 含む行を、B.lstから抽出して、リダイレクトで出力するには、 どういうコマンド操作になるのでしょうか。 特定の文字列ならば単純に、cat B.lst | grep moziretsu > sample.lst でいいわけですが、この文字列がA.lstファイル内に複数行あり、 それを順にgrepするにはどうすればいいのかがわかりません。 シェルもただいま勉強中です。 よろしくご教授願います。

  • perl ディレクトリ ツリー表示

    下記ソースコードでカレントディレクトリのツリー表示ができますが、これを特定のディレクトリ内をツリー表示できるようにする方法がわかりません。 opendir関数の$dirの前にtestをつけましたが、うまく行きません。 特定のディレクトリは任意で変えることができることとします。 sub treelist_ { my ($dir, $lv) = @_; opendir my $dh, $dir; my @files = grep { $_ !~ /^\.\.?$/; } readdir $dh; closedir $dh; for my $file (@files) { print ">" x $lv, "$dir/$file\n"; treelist_("$dir/$file", $lv+1) if -d "$dir/$file"; } } sub tree { for my $dir (@_) { print "$dir\n"; treelist_($dir, 0); } } tree('.');

  • grepコマンドでの文字列検索

    grepコマンドについて質問です。 grepコマンドでCSVファイルを参照し、ある項目に特定の文字列でないものがあれば、そのファイル名を取得する処理をしたいと思っています。 つまり、ある項目を$strとすると $str <> 'aaaaaa' という処理をgrepで行おうと考えています。 現状では、 grep -l '^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,[^(aaaaaa)]' ファイル名 等を試していますが、[^(aaaaaa)]だと一文字目しか判別できていないようです。[^a{6}]などもうまくいきません。 何かいい方法があれば教えて頂きたいと思います。 宜しくお願いします。

  • コマンドプロンプト dir でのソート

    Windows7のコマンドプロンプトにてdirコマンドでのソートについて教えてください。 ソートするファイルはデジカメ写真群(jpeg形式)です。 ファイルが入ったフォルダでプロパティを見ると「日付時刻」「撮影日時」「アクセス日時」 「作成日時」「更新日時」があります。 推測ですが、写真を回転し保存したりして「更新日時」が変わっているのでは…と思って います。 複数のデジカメで撮った写真を撮影日時の順でソートしたくて dir/od と打つとどうやら 「撮影日時」のソートではなく「更新日時」でソートされている模様。 「撮影日時」でソートさせるにはどんなコマンドを打てばいいでしょうか? あるいはdirコマンドで「撮影日時」の情報も拾えればいいのですが....。 数百枚の写真を効率よく「撮影日時」でソートしたいです。 よろしくお願いします。 やりたいのは、リダイレクトした結果を元にファイル名を撮影日時順にナンバリングしたい のです。(意味通じます?)

専門家に質問してみよう