
No.6ベストアンサー
- 回答日時:
#2 です。
力技ですが。。
in_data.txt
{第1章}
aaaaaaaaaaaa。\\bbbbbbbbb
ccccccccccccccccccc。\\
{第2章}
ddddddddddddddd。\\eeeeeeeeeee
fffffff。\\ggggggggggggggggggggggggggg。\\
スクリプト
#!/usr/local/bin/perl
$fin = "in_data.txt";
$s = "";
@t = ();
# ファイルを読み込みつつ、@tへ取り込む
open(IN, $fin) or die "open error.";
while(<IN>) {
chop;
if ($_ =~ /{第(\d+)章}/) {
$s = $1;
}
else {
$t[$s] .= $_;
}
}
close(IN);
# テスト表示をする。
for $i (0 .. scalar(@t)-1) {
if ($t[$i] ne "") {
print "第${i}章\n";
print $t[$i]. "\n";
}
}
結果
第1章
aaaaaaaaaaaa。\\bbbbbbbbbccccccccccccccccccc。\\
第2章
ddddddddddddddd。\\eeeeeeeeeeefffffff。\\ggggggggggggggggggggggggggg。\\
って感じになりました。
このスクリプトでは、章番号をキーとした配列 @t を作り、
その中に取り込んでいます。
目的は、こんな事でしょうか?
Dpop様、回答下さりありがとうございます。
教えていただきましたプログラムを実行してみましたところ、目的のものが表示できました。章番号をキーとした配列 @tを使うと第1章だけでなくその後の章も
取り出して表示できるのですね。
本当に助かりました。ありがとうございます。
No.5
- 回答日時:
何度もごめんなさい。
#4で答えた内容から、#3の回答は無かったことにしてください(改行が\nという前提で話してしまったので)ただ、参考プログラムをそのままコピペしたらちゃんと動作したのですが・・、file.txt の中身は具体的にどういう感じの文章が入っているのでしょう。私は
{第1章}aaa\\bbb\\cc
{第2章}ddd\\eee\\ff
という中身にして調べてみました。
arcsin様、こちらこそ謝らなくてはいけません。
file.txtの中身は具体的にこのようになっています。
------------------------
{第1章}
aaaaaaaaaaaa。\\bbbbbbbbb
ccccccccccccccccccc。\\
{第2章}
ddddddddddddddd。\\eeeeeeeeeee
fffffff。\\ggggggggggggggggggggggggggg。\\
-----------------------------------------------
ですので、最初にarcsin様がおっしゃったように
改行(\n)が含まれるのですね。\\で改行を表すことにしているのですが、file.txtでは無関係でした。すみませんでした。file.txt自体の改行は上記のように、{第1章}の次、・・・bの次、・・・c。\\の次、・・・というようになっております。
それで、#1でのスクリプトを実行してみると、何も表示されません。
試しにfile.txtを
------------------------
{第1章}aaaaaaaaaaaa。\\bbbbbbbbb
ccccccccccccccccccc。\\
{第2章}
---------------------------------
というようにしてみるとaaaaaaaaaaaa。\\bbbbbbbbbだけ表示されました。なので、最初にやったのはやはり入っていないのですね。
そもそもの正規表現$shou=$1 if/\{第1章\}(.*)/s;がまずいのでしょうか?file.txtでは{第1章\}のあとに
改行が入っているからだめなのですね。if/\{第1章\}\n(.*)/s;と変えてみましたが、表示されませんでした。
#3で教えていただきました方法について、これから試してみます。
No.4
- 回答日時:
> 改行は含んでいるのですが、(\n)ではなく
(\\)で行っているのですが、そのときの
オプションもsをくっつけるのでしょうか?
答え忘れていました。コレについて、(\\)で改行を行っているというのはどういうことでしょうか・・?改行の変わりに「\\」という文字を使っているということですか?もしそうであれば、sはいらないと思います。ちょっとこれに関しては私の知識不足かもしれないので違うようでしたら他の方にオマカセということで・・・。
No.3
- 回答日時:
while(<IN>){
$shou=$1 if/\{第1章\}(.*)/s;
s/\{第1章\}(.*)/$1/s;
print OUT;
}
この部分ですが、while(<IN>)は標準入力を改行ごとにわけながら$_に値を代入していきます。
なので、たとえば
---kekka1.txt----------
{第一章}
あいうえお
かきくけこ
-----------------------
であれば、最初のループでは、$_に「{第一章}\n」が代入され、その次のループで「あいうえお」が代入され・・という風に1行ずつループします。
なので、最初のループで
$shou=$1 if/\{第1章\}(.*)/s;
にマッチしたといえども、元の$_が「{第一章}\n」なので、$shouには何も入ってないように見えます。そうならないようにするためには最初に、
while($_ .= <IN>){}
等して一度変数に文章を全部詰めるべきだと思います。(上の表記は適当なので間違ってるかも)
No.1
- 回答日時:
まず文章とおっしゃっているので、
$_には改行(\n)を含む文字列が入っているんですよね?
正規表現でオプションを何もつけないと「.」は「改行を含まない任意の文字」の意味になります。なので「改行を含む任意の文字」にするため(複数行モード?)に、オプションsをくっつけます。
さらに(.*?)の「?」は最小マッチといって、「.*」の正規表現を満たす最小マッチだけ取得します。「.*」は任意文字の0以上の繰り返しを意味しますから、この最小マッチは「任意の文字の0回の繰り返し」つまり何も無いものがマッチしてしまうので$1には何もきません。(?についてはあまりしらないのでもしかしたらこの解説は違うかもしれません)
なのでこの?もとってやりましょう。つまり、
$shou=$1 if/\{第1章\}(.*)/s;
が正しい記述になります。
arcsin様、回答を下さりありがとうございます。
>$_には改行(\n)を含む文字列が入っているんですよね?
すみません、最初に書くのを忘れてしまいました。
改行は含んでいるのですが、(\n)ではなく
(\\)で行っているのですが、そのときの
オプションもsをくっつけるのでしょうか?
$shou=$1 if/\{第1章\}(.*)/s;
として、行ったのですがブラウザに表示されませ ん。
----------------
#!C:\Perl\bin\perl
use CGI;
my $form = CGI->new;
$form->charset('Shift_JIS');
print $form->header(-type => "text/html");
open(IN,"<file.txt");
open(OUT,">kekka1.txt");
while(<IN>){
$shou=$1 if/\{第1章\}(.*)/s;
s/\{第1章\}(.*)/$1/s;
print OUT;
}
close(OUT);
close(IN);
print $shou;
-------------------
というスクリプトなのですが、kekka1.txtで確認すると{第1章}の次に続く文章の抽出には成功しています。
なぜ$shouに入っていないのでしょうか?(表示されないのでしょうか?)
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 10:07
- PHP PHP MySql ページング 2 2022/09/20 06:38
- PHP カラーミーショップのSmartyでの文字列抜き出し 2 2022/05/06 11:51
- Excel(エクセル) エクセルにおいてセル内の文字を出来るだけ大きく表示する方法を教えてください。 4 2022/07/30 08:08
- Excel(エクセル) エクセル関数の変わった使い方 3 2022/05/13 17:12
- C言語・C++・C# プログラミングの問題です。至急教えてください。 /***から***/の部分をプログラミングにしてほし 1 2022/10/13 11:48
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/02/10 11:41
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 08:37
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/03/09 16:55
- その他(プログラミング・Web制作) Pythonを用いたフラッシュ暗算ソフトの開発に必要なもの 2 2023/01/29 02:22
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テキストファイルで提出とは?
-
INDIRECT 横に再度抽出したい
-
openした後、closeしないでプロ...
-
ファイルアイコンの左下に緑の□...
-
Strawberry Perl for Windows ...
-
PerlでUTF-8のファイルの文字列...
-
Perlのエラーについてご教授く...
-
perlの構文でカンマの意味が分...
-
Perlで特定文字列から特定文字...
-
perl 初等プログラミングについて
-
perlのflock関数でロックをかけ...
-
perlで2次元配列をサブルーチ...
-
Perl の外部モジュールの利用方法
-
ラズベリーパイ初心者です。 ラ...
-
perl の open について教えてく...
-
Perl言語について。
-
ファイルをディレクトリ分配の...
-
アルファベットに付いて質問し...
-
#!/usr/bin/perlで書きだしたCG...
-
AI sisterとは、偽物の人ですか?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
Perlのエラーについてご教授く...
-
INDIRECT 横に再度抽出したい
-
bashスクリプト
-
perlをバージョンアップしたら...
-
perlプログラミング 空白行削除
-
Wallpaper Engineでおすすめの...
-
perlのflock関数でロックをかけ...
-
Strawberry Perl for Windows ...
-
フローチャート 九九
-
perlについての質問
-
ターミナルで特定の文字と文字...
-
LinuxにおいてのPerlのプログラ...
-
P.Cのシングルチューナーとダブ...
-
PerlでUTF-8のファイルの文字列...
-
【超初心者】異なるディレクト...
-
perlで複数のファイルの処理に...
-
Perl 順位の重複
-
Perlで特定文字列から特定文字...
おすすめ情報