ページ 1 / 1
カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 14:22
by 天和
使用OS Mac
コンパイラ GCC
技術レベル fopenが使える程度。
前回の投稿で(URL
http://www.play21.jp/board/formz.cgi?ac ... &rln=45491)
(課題はカレントディレクトリ内にある.cファイルのすべてを対象にしてその次に検索したい言葉を入力して
ファイル名と検索したい言葉がある行の文章そしてその行の行数を出力するプログラムを作りなさい。 )
解決しましたといっときながらなんですが・・・
以下のようにプログラムを組んだのですが
#include<stdio.h>
#include<stdlib.h>
int main(void){
FILE *fp;/*検索対象になるファイル*/
FILE *fl;/*filelist用*/
int ch;/*putchar用*/
int che;/*putchar用(filelist用の)*/
int h, i, j, k, n, s;
int count;/*文字の判定*/
int count2;/*行の文字数*/
int count3;/*forループ用*/
int flag;/*判定*/
char fname[1024];/*検索したいファイル名*/
char word[1024];/*検索したい文字列*/
char string[1024];/*文字を格納する場所*/
h = 0;/*ファイル名用*/
i = 0;/*行数用の数字*/
j = 0;/*j番目の文字列*/
n = 0;/*検索したい文字列が今何文字あってるか?*/
s = 0;/*検索したい文字数*/
count = 0;
system("ls *.c > filelist");
printf("検索したい文字は?");
scanf("%s", word);
while(1){
if(word[j] == '\0')
break;
s++;
j++;
}
j = 0;
if((fl = fopen("filelist", "r")) == NULL)/*filelistが存在しているかチェックする*/
printf("ERROR\n");
else{
while((che = fgetc(fl)) != EOF){
if(che == '\n' || che == EOF){
/*filelist内の改行もしくはEOFがあった場合fname内の文字データと同じファイル名のファイルを開く*/
fname[h] = '\0';
printf("%s\n", fname);
h = 0;
i = 0;
j = 0;
n = 0;
s = 0;
count = 0;
count2 = 0;
count3 = 0;
if((fp = fopen(fname, "r")) == NULL)/*fname内の文字データと同じファイル名が存在するかチェックする*/
printf("ERROR2\n");
else{
i++;/*最初の行数*/
while((ch = fgetc(fp)) != EOF){
string[count2] = ch;
count2++;
if(count == 0)/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
{
j = 0;
n = 0;
}
if(ch == '\n')/*もし改行なら行番号をあげなさい*/
{
i++;
string[count2] = '\0';
if(flag == 1){
count3 = 0;/*forループに使用*/
for(;count3 < count2 + 1; count3++)
printf("%c", string[count3]);
}
count2 = 0;
flag = 0;
}
}
fclose(fp);
}
}
fname[h] = che;
h++;
}
}
fclose(fl);
return 0;
}
エラーが出ないはいいのですが上のソースを実行すると
検索したい文字は?printf
2-11.c
2-7.c
ERROR2
3-11.c
ERROR2
3-11a.c
ERROR2
3-14.c
ERROR2
3-15.c
ERROR2
3-16.c
ERROR2
3-18.c
ERROR2
4-13.c
ERROR2
az.c
ERROR2
bubble.c
ERROR2
copy.c
ERROR2
ennsyuu3-1.c
ERROR2
exlexico.c
ERROR2
file.c
ERROR2
fopen.c
ERROR2
fopen2.c
ERROR2
fopen3.c
ERROR2
fscanf.c
ERROR2
ifbun.c
ERROR2
kouzoutai.c
ERROR2
list13-10.c
ERROR2
list13-6.c
ERROR2
list13-9.c
ERROR2
search.c
ERROR2
switch.c
ERROR2
switch2.c
ERROR2
syukudai.c
ERROR2
test.c
ERROR2
time.c
ERROR2
と出てしまいます(最初の.cファイルだけなぜかエラーが出ませんが)
カレントディレクトリ内のファイル名はきちんと出ているので
ファイル名を検索するとき多分文字のデータとして扱われてないんじゃないかと思われるのですが。
(if((fp = fopen(fname, "r")) == NULL)/*fname内の文字データと同じファイル名が存在するかチェックする*/
printf("ERROR2\n"); のとき)
最初にERROR2と表示されずきちんと表示されているファイル名のファイル内の検索をする対処法をお願いします。

Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 14:59
by box
インデントにポリシーがないため、ソースが見づらくて仕方ありません。
まずはそこから手をつけてみてはいかがでしょう。
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 15:20
by 天和
>boxさん
編集>再インデントとやってみましたが
(なんかコメントがちょっと見づらいので勝手に自分で改行とかしてますが)
#include<stdio.h>
#include<stdlib.h>
int main(void){
FILE *fp;/*検索対象になるファイル*/
FILE *fl;/*filelist用*/
int ch;/*putchar用*/
int che;/*putchar用(filelist用の)*/
int h, i, j, k, n, s;
int count;/*文字の判定*/
int count2;/*行の文字数*/
int count3;/*forループ用*/
int flag;/*判定*/
char fname[1024];/*検索したいファイル名*/
char word[1024];/*検索したい文字列*/
char string[1024];/*文字を格納する場所*/
h = 0;/*ファイル名用*/
i = 0;/*行数用の数字*/
j = 0;/*j番目の文字列*/
n = 0;/*検索したい文字列が今何文字あってるか?*/
s = 0;/*検索したい文字数*/
count = 0;
system("ls *.c > filelist");
printf("検索したい文字は?");
scanf("%s", word);
while(1){
if(word[j] == '\0')
break;
s++;
j++;
}
j = 0;
if((fl = fopen("filelist", "r")) == NULL)/*filelistが存在しているかチェックする*/
printf("ERROR\n");
else{
while((che = fgetc(fl)) != EOF){
if(che == '\n' || che == EOF){/*filelist内の改行もしくはEOFがあった場合fname内の文字データと同じファイル名のファイルを開く*/
fname[h] = '\0';
printf("%s\n", fname);
h = 0;
i = 0;
j = 0;
n = 0;
s = 0;
count = 0;
count2 = 0;
count3 = 0;
if((fp = fopen(fname, "r")) == NULL)
/*fname内の文字データと同じファイル名が存在するかチェックする*/
printf("ERROR2\n");
else{
i++;/*最初の行数*/
while((ch = fgetc(fp)) != EOF){
string[count2] = ch;
count2++;
if(count == 0)
/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
{
j = 0;
n = 0;
}
if(ch == '\n')/*もし改行なら行番号をあげなさい*/
{
i++;
string[count2] = '\0';
if(flag == 1){
count3 = 0;/*forループに使用*/
for(;count3 < count2 + 1; count3++)
printf("%c", string[count3]);
}
count2 = 0;
flag = 0;
}
}
fclose(fp);
}
}
fname[h] = che;
h++;
}
}
fclose(fl);
return 0;
}
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 15:37
by たかぎ
前回までの内容を追っていないのでよくわかりませんが...
system関数でlsコマンドを呼び出すのであれば、grepコマンドを読んだほうが手っ取り早くないですか?
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 15:42
by box
「検索したい文字は?」
で入力した文字列を全然使ってないんですけど…。
使わなくていいんですか?
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 17:46
by 天和
>boxさん
すいませんチェックしたときエラーがなかったものですからつい忘れてしまいました以下が修正したものです。
#include<stdio.h>
#include<stdlib.h>
int main(void){
FILE *fp;/*検索対象になるファイル*/
FILE *fl;/*filelist用*/
int ch;/*putchar用*/
int che;/*putchar用(filelist用の)*/
int h, i, j, k, n, s;
int count;/*文字の判定*/
int count2;/*行の文字数*/
int count3;/*forループ用*/
int flag;/*判定*/
char fname[1024];/*検索したいファイル名*/
char word[1024];/*検索したい文字列*/
char string[1024];/*文字を格納する場所*/
h = 0;/*ファイル名用*/
i = 0;/*行数用の数字*/
j = 0;/*j番目の文字列*/
n = 0;/*検索したい文字列が今何文字あってるか?*/
s = 0;/*検索したい文字数*/
count = 0;
system("ls *.c > filelist");
printf("検索したい文字は?");
scanf("%s", word);
while(1){
if(word[j] == '\0')
break;
s++;
j++;
}
j = 0;
if((fl = fopen("filelist", "r")) == NULL)/*filelistが存在しているかチェックする*/
printf("ERROR\n");
else{
while((che = fgetc(fl)) != EOF){
if(che == '\n' || che == EOF){
/*filelist内の改行もしくはEOFがあった場合fname内の文字データと同じファイル名のファイルを開く*/
fname[h] = '\0';
printf("%s\n", fname);
h = 0;
i = 0;
j = 0;
n = 0;
s = 0;
count = 0;
count2 = 0;
count3 = 0;
if((fp = fopen(fname, "r")) == NULL)/*fname内の文字データと同じファイル名が存在するかチェックする*/
printf("ERROR2\n");
else{
i++;/*最初の行数*/
while((ch = fgetc(fp)) != EOF){
string[count2] = ch;
count2++;
if(count == 0)
/*1文字前の判定1文字前が検索したい文字列の中の1文字でないなら検索したい文字列の1文字目からやり直し*/
{
j = 0;
n = 0;
}
if(ch == word[j])/*検索したい言葉のj番目とおなじもじですか?*/
{
n++;/*同じ文字かの正解数を1つあげる*/
count++;/*現在の文字が正解か否かの判定*/
j++;/*検索したい次の文字にチャレンジする*/
}
else{
count = 0;
/*不合格なので検索したい最初の文字からやり直し*/
}
if(s == n){
/*もし検索したい文字数と正解数が一緒ならその行番号を出力しなさい*/
printf("%d:", i);
flag = 1;
j = 0;
n = 0;
}
if(ch == '\n')/*もし改行なら行番号をあげなさい*/
{
i++;
string[count2] = '\0';
if(flag == 1){
count3 = 0;/*forループに使用*/
for(;count3 < count2 + 1; count3++)
printf("%c", string[count3]);
}
count2 = 0;
flag = 0;
}
}
fclose(fp);
}
}
fname[h] = che;
h++;
}
}
fclose(fl);
return 0;
}
ちなみにまだERROR2の所でつまずいているためキチンと行番号が出るとかの確認とかしていません。
>たかぎさん
> 前回までの内容を追っていないのでよくわかりませんが...
>system関数でlsコマンドを呼び出すのであれば、grepコマンドを読んだほうが手っ取り早くないですか?
grep -n while ./*cとかだと確かに出せますがプログラムでやると1種類の言葉でしかできませんよね?
greo -n word(検索したい文字データが入っている配列)./*cみたいにできませんし
あとなるべくgrepは禁止の方向でお願いします。
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 18:09
by qwerty
>>たかぎさん
>grepコマンド
Unix系ではこのような便利なコマンドがあるんですね。
初めて知りました。
確かにこのコマンドを利用すれば天和さんの求めている動作を容易に実現できそうです。
>>天和さん
>プログラムでやると1種類の言葉でしかできませんよね
入力された文字列をsprintfなどで配列変数に格納し、
それをsystem関数に引数として渡してやれば出来そうですよ。
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 18:15
by box
1文字ずつ読んではチェックしていく、というのは
いかにも効率が悪そうです。
1行分を丸ごと読んで、strstrあたりの関数を使って検索する方が
よほど効率的ではないかと思います。
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 18:19
by たかぎ
grepを使わないとして...
> 1行分を丸ごと読んで、strstrあたりの関数を使って検索する方が
> よほど効率的ではないかと思います。
fgets等でいちいち読み込むより、mmapでファイルの内容をメモリにマッピングして操作した方が簡単かと思います。
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 18:39
by box
mmapは初めて知りました。
機会が訪れれば使ってみようと思います。
永遠に訪れないかもしれませんが…。
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 20:05
by 天和
>boxさん
そんな便利な関数あったんですねありがとうございます。
そして早速作ってみたのですが
#include<stdio.h>
int main(void)
{
char *ch;
FILE *fp;
char fname[99]; /*検索したいファイル名*/
char word[99]; /*検索したい文字列*/
char string[1024];/*検索対象になる文字列*/
int i, n;
i = 0;/*行数用の数字*/
n = 1024;/*fgetsで使う*/
printf("FILEname?\n");
scanf("%s", fname);
printf("検索したい文字は?");
scanf("%s", word);
if((fp = fopen(fname, "r")) == NULL)/*検索したいファイル名は存在しますか?*/
printf("ERROR");
else{
i++;
while((ch = fgets(string, n, fp)) != EOF)
{
if((ch = strstr(ch,word)) != NULL){
printf("%d:", i);
puts(ch);
}
i++;
}
}
fclose(fp);
return 0;
}
エラーは出ませんが警告はでます。
(警告内容)
search.c:42: warning: comparison between pointer and integer
search.c:45: warning: incompatible implicit declaration of built-in function ‘strstr’
(出力結果)
FILEname?
fopen.c
検索したい文字は?printf
25:printf("検索したい文字は?");
38:printf("ERROR\n");
46:printf("%s\n", fname);
58:printf("ERROR2\n");
98:printf("%d:", i);
117:printf("%c", string[count3]);
Bus error
>たかぎさん
すいません今回はそのstrstrの方向でいかせていただきます。
>qwertyさん
>入力された文字列をsprintfなどで配列変数に格納し、
それをsystem関数に引数として渡してやれば出来そうですよ。
まあでもgrepは使ってはいけませんから・・・。
Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 22:09
by box
> (警告内容)
> search.c:42: warning: comparison between pointer and integer
> while((ch = fgets(string, n, fp)) != EOF)
ファイルを読み終わったときにfgetsは何を返すのでしょうか? EOFでしょうか?
> search.c:45: warning: incompatible implicit declaration of built-in function ‘strstr’
strstr関数の引数の型(constがらみ)の話だと思います。

Re:カレントディレクトリ内の検索
Posted: 2010年1月11日(月) 22:42
by たかぎ
> strstr関数の引数の型(constがらみ)の話だと思います。
違うでしょう。
関数原型なしでstrstrを呼び出しているので、
int strstr();
とみなされるわけですが、これは組み込み関数のシグニチャと矛盾することが指摘されているのです。
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 01:14
by しえる
すみません天和さんへの私信です。
以前こちらの投稿を見たのですが。
http://www.play21.jp/board/formz.cgi?ac ... &rln=45023
mygrep.plの動作は天和さんの理解されているものとは違うと思いますよ。
># Usage: mygrep pattern file1 file2 ...
と書かれてますので、コマンドプロンプトからこんな感じに使う想定です。
mygrep printf main.txt main2.txt
→main.txtとmain2.txtからprintfを探す
出題者の方がいるなら確認してみるのをお勧めします。
あとついでに、
grep -n while ./*.c
の"./*.c"はワイルドカードというもので、
こう指定するとどうなるのかも聞いてみた方がいいかも。
初心者にはかなり難しい問題です。
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 13:34
by 天和
>しえるさん
えーと今回の課題は$ grep -n 文字列 ファイル名と同じ効果をもつプログラムを作りなさい
ということなのでよくわからないので教授に「ようするにカレントディレクトリ内にある.cファイル例えば
printfならprintfと書かれている文字列を行番号付きで出せとのことでしょうか?」
と聞いたら「はいそうです」といったので上のようなソースを作った訳なんですけど
ちなみに教授はそれをPerl言語で書くと
# grep for perl version
# Usage: mygrep pattern file1 file2 ...
#
if (@ARGV < 1) {
die "Usage: mygrep pattern [file..]\n";
}
$pattern = shift;
foreach $file (@ARGV) {
open(FILE, $file);
$line = 1;
while (<FILE>) {
print "$file $line: $_" if /$pattern/o;
$line++;
}
close(FILE);
}
と同じになるっていってたんですけど間違えたんでしょうか?
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 15:25
by qwerty
>>天和さん
>間違えたんでしょうか?
大筋は合っていると思いますが、少し無駄に拡大解釈しているのだと思います。
課題の内容は“コマンドラインから受け取ったファイル名”を対象として、そのファイルに対し検索を実行するようです。
それをあたかもワイルドカードまで考慮して実装しなくてはならないような解釈をしておられるようなので、
話がややこしくなっているのだと思います。
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 17:20
by 天和
>qwertyさん
あっじゃあ自分はこの課題の大部分はすでにできているということでしょうか?
(ファイルをひとつ指定して検索するプログラムはできているため)
まあ今度はコマンドラインからの入力で反応できなきゃだめですが・・・
(scanfをつかってファイル指定しているため)
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 17:44
by たかぎ
Perlのコードを見る限り、パターンやファイル名の指定はコマンドライン引数で与える必要があるのではないでしょうか?
だとすれば、ワイルドカードの扱いも簡単に解決できます。
それより、Perlのコードに合わせるためには、正規表現も必要になります。非標準の関数を使ってもよいのかどうか知りませんが、非標準関数を使わずに正規表現を実装するのは大変です。
仮に非標準関数を使ってもよいとしても、Perlの正規表現と同じ動作にするのは困難です。いっそ、system関数でPerlを呼び出した方がよいと思います。
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 19:09
by 天和
>たかぎさん
つまりsystem関数で
if (@ARGV < 1) {
die "Usage: mygrep pattern [file..]\n";
}
$pattern = shift;
foreach $file (@ARGV) {
open(FILE, $file);
$line = 1;
while (<FILE>) {
print "$file $line: $_" if /$pattern/o;
$line++;
}
close(FILE);
}
を呼び出せということでしょうか?
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 19:13
by qwerty
>>たかぎさん
対象ファイルにしか目が行ってませんでしたが、たしかに検索文字列に正規表現が使われていますね。
「同等以上」のプログラムとなると難しそうです。
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 19:22
by たかぎ
> つまりsystem関数で
> (中略)
> を呼び出せということでしょうか?
まあ、そういうことです。
強引にワンライナーで呼び出してください。
grepは使いたくないけれど、PerlならOKですよね。
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 19:39
by 天和
>たかぎさん
もしかしてそれって
perl mygrep.pl while ./*.cってやつでしょうか?
それだとしたたぶんだめです課題のプリントにすでに書いてあるので・・・。
(mygrep.plは上のperl言語のソースコードが書いてあるファイルです)
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 19:42
by たかぎ
> もしかしてそれって
> perl mygrep.pl while ./*.cってやつでしょうか?
違います。
system("perl -e \'スクリプト\'");
のように、system関数を使って呼び出してください。
@ARGVを使う必要はないので、スクリプトに必要なパラメータを直接埋め込めばよいでしょう。
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 20:21
by 天和
すいません自分perl言語なんてやったことないのでよくわからないのですが。
文字検索するワンライナーとはどんなのでしょうか?
逆ならあったのですが・・・
参考URL
http://dyno2316.blogspot.com/2009/07/bl ... _3805.html
# '@'が含まれていない行を表示
perl -ne "print unless /@/" aaa.txt
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 20:27
by たかぎ
> すいません自分perl言語なんてやったことないのでよくわからないのですが。
> 文字検索するワンライナーとはどんなのでしょうか?
話すと長くなるので、Perlの解説サイトでも見てください。
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 20:44
by hoge
> すいません自分perl言語なんてやったことないのでよくわからないのですが。
> 文字検索するワンライナーとはどんなのでしょうか?
> 逆ならあったのですが・・・
同じページにあるじゃん。
# grepのように使う
perl -ne "print if (/検索パターン/)" filename
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 22:06
by 天和
>hogeさん
あっホントですね。
でもこのままだと特定のひとつのファイルまたはカレントディレクト内全部検索できるのはいいですが
行番号とファイル名が・・・
なのでとりあえずファイル名を文字データとして代入させてやる感じにしないといけないわけですが。
#include<stdio.h>
#include<stdlib.h>
int main(void)
{
char fname[1025];
scanf("%s" fname);
system("perl -ne 'print if while' fname");
return 0;
}
だとfnameというファイルを探してしまうんですがfname内にある文字データで検索させるにはどうすればいいんでしょう?
Re:カレントディレクトリ内の検索
Posted: 2010年1月12日(火) 22:11
by box
> > strstr関数の引数の型(constがらみ)の話だと思います。
>
> 違うでしょう。
> 関数原型なしでstrstrを呼び出しているので、
はい。大間違いでした。
string.hをインクルードしていなかったからですね。
Re:カレントディレクトリ内の検索
Posted: 2010年1月13日(水) 13:17
by 天和
YAHOO知恵袋に答えらしきものがあったのですが・・・
http://detail.chiebukuro.yahoo.co.jp/qa ... 1035210505
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
static void
grep_file(const char *file, const char *pattern)
{
FILE *fp;
int line;
char buf[BUFSIZ];
/* ファイルをオープンする */
fp = fopen(file, "r");
if (fp == NULL)
{
/* ファイルのオープンに失敗 */
return;
}
line = 1;
/* 注意
下記のコードは簡易版です。バイト数が BUFSIZ を超える行がある場合、
正しく動作しません。但し、この課題が、C言語初学者用のものである
ならば、十分な内容です。*/
/* ファイルから一行ずつ取り出しながら処理する */
while (fgets(buf, sizeof(buf), fp) != NULL)
{
/* buf の中に pattern があれば、strstr() は NULL 以外を返す */
if (strstr(buf, pattern) != NULL)
{
printf("%s %d: %s", file, line, buf);
}
++line;
}
/* 開いたファイルを閉じる */
fclose(fp);
}
int
main(int argc, char *argv[/url])
{
int i;
/* 引数が何も指定されていない場合 */
if (argc <= 1)
{
printf("Usage: mygrep pattern [file...]\n");
return EXIT_FAILURE;
}
/* 二番目以降の引数をファイル名とみなし、それらを一つずつ処理する */
for (i = 2; i < argc; ++i)
{
/* 第一引数にファイル名、第二引数にパターンを指定して
grep_file() 関数を呼び出す。*/
grep_file(argv, argv[1]);
}
return EXIT_SUCCESS;
}
(ちなみに知恵袋の質問者は自分じゃありません)
なんかワンライナーとか使わなくてもできそうですね
Re:カレントディレクトリ内の検索
Posted: 2010年1月13日(水) 13:26
by たかぎ
> なんかワンライナーとか使わなくてもできそうですね
(Perl式の)正規表現が使えないので、できたとはいわないのでは?
Re:カレントディレクトリ内の検索
Posted: 2010年1月13日(水) 13:57
by 天和
>たかぎさん
知恵袋のほうだと正規表現スルーしてますねたしかに
でも問題文といいファイル名といいたぶん自分の大学と同じ人だと思うんですけどね。
でもうちの教授何もいわなかったんですよね(正規表現のありなしを)せいぜい
「力技でもいいよ」とはいったんですが。
やっぱりワンライナーで真面目にやるしかないですよね?
Re:カレントディレクトリ内の検索
Posted: 2010年1月13日(水) 14:06
by たかぎ
> でもうちの教授何もいわなかったんですよね(正規表現のありなしを)せいぜい
> 「力技でもいいよ」とはいったんですが。
Perlならこうなるというコードを示されていますから、正規表現は当然必要です。
正規表現不要なら、Perlのコードでも正規表現が働かないように実装しなければなりませんから。
「力技」が何を意味するのかわかりませんが、Perlをワンライナーで呼び出すのは十分力技です。
Re:カレントディレクトリ内の検索
Posted: 2010年1月13日(水) 14:13
by 天和
>たかぎさん
perlをワンライナーで呼び出すって結構力技だったんですね
初めてやってる自分からするとかなり新鮮なかんじがしたんですが。
そして話し変えますけど、次、どうすればいいんでしょうか?
perl -ne "print if (/検索パターン/)" filename
だと文字は出してくれてもファイル名と行数は出してくれませんし・・・
(自分がPerlをワンライナーで呼び出すってことを勘違いしてるだけかもしれませんが)
Re:カレントディレクトリ内の検索
Posted: 2010年1月14日(木) 12:30
by 天和
今日教授に聞いたところ正規表現のほうはスルーしてもいいみたいのなので
YAHOO知恵袋を参考に作りたいと思いますので解決とさせていただきます。
お手数とらせて申し訳ありません。
