• ベストアンサー

英文の先頭の文字を大文字にしたいです

こんにちは、皆さん。 私は今、Perlプログラミングを勉強しています。 全て小文字で入力された複数の英文があり、これを先頭の文字を大文字にしたいと思います。 英文と言ってもいろいろなパターンがあると思いますが、質問したいのはごく基本的な形(行頭の英文字を大文字にする)というのが知りたいです。 WEBにも過去の質問にもありませんでしたので、どなたかご存知の方がいらっしゃったら教えてください。 よろしくお願い致します。

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

  • ベストアンサー
回答No.6

補足中の、 $_ =~ s/([smtwf].*day)/ucfirst($1)/eg; ですが、'.'は改行以外のすべての文字とマッチしてしまうので、英数文字をあらわす'\w'で置き換え、 $_ =~ s/([smtwf]\w*day)/ucfirst($1)/eg; とするのが正しいです。 (でもこれだとdayも引っかかるので、[smtwf]\w+day がいいでしょうね) 共通項であるdayをまとめるのなら、 $_ =~ s/\b((sun|mon|tues|wednes|thurs|fri|satur)day)\b/ucfirst($1)/eg; という書き方でどうでしょうか。(\bは入れておいたほうがいいと思います) また、置換項目を変数で管理したかったら、 @week = ('sun','mon','tues','wednes','thurs','fri','satur'); $line = "today is friday. tomorrow is saturday. the day next tomorrow is sunday."; foreach $_(@week){ $line =~ s/\b(($_)day)\b/ucfirst($1)/eg; } とか。見栄えはよくなります。 (ここまでやるとdayをまとめるとかは考えなくてもいいですね)

noname#17299
質問者

お礼

ご回答ありがとうございます。 配列変数で管理するとスッキリしますね。 曜日だけでなく、いろいろなところで応用が効きそうです。 いろいろ勉強になってよかったです。 将来的にはプログラマーになりたいと思っていますので、 また質問するときはよろしくお願いします。 ありがとうございました。

その他の回答 (5)

回答No.5

ちょっと複雑ですが、 $line =~ s/\b(\w*day)\b/ucfirst($1)/eg; \bは単語の区切り(スペースや改行、タブ、ピリオド、コンマなど)、\wは英文字をあらわします。 単語と単語の区切りに囲まれ、"day"で終わる英単語の頭を大文字に変えます。 todayやyesterdayは個別に戻してやってください(^^;

noname#17299
質問者

補足

早いご回答ありがとうございます。 試しにサンプルを作ってみたところ、次のような結果になりました。 ---------------------------------------------------------------- #!/usr/bin/perl $_ = "today is friday. tomorrow is saturday. the day next tomorrow is sunday."; $_ =~ s/\b(\w*day)\b/ucfirst($1)/eg; print $_ . "\n"; ---------------------------------------------------------------- <<結果>> Today is Friday. tomorrow is Saturday. the Day next tomorrow is Sunday. やはりちょっと発展させて、sunday, monday, tuesday, … ,saturdayだけ、 変換するようにしようと思って、 $_ =~ s/([smtwf].*day)/ucfirst($1)/eg; としてみたところ、行頭のtodayしか変換されませんでした。 (これだと、うまくいってもtodayが変換されてしまいますが…) Today is friday. tomorrow is saturday. the day next tomorrow is sunday. しかたないので、 $_ =~ s/((sunday|monday|tuesday|thursday|friday|saturday|^today))/ucfirst($1)/eg; としてみたところ、うまく行きました。 <<結果>> Today is Friday. tomorrow is Saturday. the day next tomorrow is Sunday. でもこれだとちょっと見栄えが悪いので、もう少し何とかしたいです。 dayが共通なのでdayをまとめて、先頭にいろいろ入れられるようにして、 そこを変えるだけでいろんなパターンが変換できるようにしたいです。 度々申し訳ありませんが、これだけ最後に教えていただけませんか?

回答No.4

行頭の文字だけを大文字にしたいのであれば、 # $lineは英文が1行分入っている $line =~ s/^(.)/uc($1)/e; 先頭の一文字を大文字にする置換演算です。

noname#17299
質問者

補足

ご回答ありがとうございます。 どうやら質問のしかたが悪かったようです。 教えていただいた方法で変換できることは確認できました。 実際にやりたかったことは次のようなことです。 例えば、英文の中にmonday、tuesdayなどが入っているとします。 これらを一括でmonday→Monday、tuesday→Tuesdayにしたかったんです。 monday、tuesdayは英文の中にランダムに入っていますので、 ○○dayがあったら先頭を大文字にしたいです。 このさいtodayも大文字にしてしまった良いです。 (あとで同様の操作でTodayはtodayに戻せるはずなので。) よろしくお願いします。

  • LancerVII
  • ベストアンサー率51% (1060/2054)
回答No.3

こんにちは。 全て小文字で入力された複数の英文というのは、 一つの変数に複数の英文があるのか、ファイル1行毎に英文ができてるのか。 また一文と見るのはピリオドまでが一つの英文とするのか等。 その辺を明示すれば、良い回答が付くかもしれません。 ucfirstという関数を使えば先頭文字は大文字になります。 (どこが先頭かは判別できません。あくまで文字列の先頭が大文字になります) 例: $test = "nice to meet you"; print $test; print "<br>"; print ucfirst ( $test ); == 結果 nice to meet you Nice to meet you

noname#17299
質問者

お礼

質問のしかたが悪いのに、良いご回答をいただけたことに感謝します。 ucfirstでWEB検索したところ出てきました。ちゃんと関数が用意されているんですね。 uc関数についても載っていたのでさらに勉強になりました。 ありがとうございました。

  • vivlet
  • ベストアンサー率36% (24/66)
回答No.2

処理を順番に考えて行きます。 1.データを変数に入れる 2.データを単位で区切り、配列に格納(行頭なら改行コード、文節ならピリオド等々) 3.配列文処理を繰り返す 3-1.英文字1文字目をucで大文字変換 こんな感じでしょうか

  • otakun
  • ベストアンサー率13% (16/122)
回答No.1

 私は、現在契約切れのフリーター(ほぼ無職)です。 30代の男性です。  『Perl』のプログラムについては何も知りませんが・・・。  行の先頭の文字を入力する時だけ、『Shift』キーを押しながら入力する・・・という方法ではダメでしょうか?  違っていたらゴメンナサイ。

関連するQ&A