• ベストアンサー

変数に格納できる文字数の限界

お世話になります。 題名の通り、Perlで変数に格納できる文字数の限界は あるのでしょうか? 100文字くらいの文章を変数に入れることができません。こういった場合はどうしたらいいかアドバイスを頂けませんでしょうか。 $shou=$1 if/\{第1章\}(.*?)/; というように{第1章}に続く文章(大体100字くらい)を抽出して、それを変数に入れたいのですが、 $shouを表示させようとしても何も表示されません。 どうぞよろしくお願いします。

  • CAL5
  • お礼率85% (48/56)
  • Perl
  • 回答数6
  • ありがとう数4

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

  • ベストアンサー
  • Dpop
  • ベストアンサー率51% (279/544)
回答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 を作り、 その中に取り込んでいます。 目的は、こんな事でしょうか?

CAL5
質問者

お礼

Dpop様、回答下さりありがとうございます。 教えていただきましたプログラムを実行してみましたところ、目的のものが表示できました。章番号をキーとした配列 @tを使うと第1章だけでなくその後の章も 取り出して表示できるのですね。 本当に助かりました。ありがとうございます。

その他の回答 (5)

  • arcsin
  • ベストアンサー率70% (28/40)
回答No.5

何度もごめんなさい。 #4で答えた内容から、#3の回答は無かったことにしてください(改行が\nという前提で話してしまったので)ただ、参考プログラムをそのままコピペしたらちゃんと動作したのですが・・、file.txt の中身は具体的にどういう感じの文章が入っているのでしょう。私は {第1章}aaa\\bbb\\cc {第2章}ddd\\eee\\ff という中身にして調べてみました。

CAL5
質問者

お礼

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で教えていただきました方法について、これから試してみます。

  • arcsin
  • ベストアンサー率70% (28/40)
回答No.4

> 改行は含んでいるのですが、(\n)ではなく  (\\)で行っているのですが、そのときの  オプションもsをくっつけるのでしょうか? 答え忘れていました。コレについて、(\\)で改行を行っているというのはどういうことでしょうか・・?改行の変わりに「\\」という文字を使っているということですか?もしそうであれば、sはいらないと思います。ちょっとこれに関しては私の知識不足かもしれないので違うようでしたら他の方にオマカセということで・・・。

  • arcsin
  • ベストアンサー率70% (28/40)
回答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>){} 等して一度変数に文章を全部詰めるべきだと思います。(上の表記は適当なので間違ってるかも)

  • Dpop
  • ベストアンサー率51% (279/544)
回答No.2

多分、#1さんの回答で良いと思うので、それは置いといて。 変数に入る文字数の方ですか。 Perlの文法自体には文字数の規定はありません。 そのため、スカラー変数に入る文字数は実装環境や実行時のメモリ容量によって決まります。

CAL5
質問者

お礼

Dpop様、回答して下さりありがとうございます。 変数の中の値(文章)が表示されないので、文字数制限があるのかと思ってしまいました。 下に書かせていただきましたが、アドバイスいただけないでしょうか。よろしくお願いします。

  • arcsin
  • ベストアンサー率70% (28/40)
回答No.1

まず文章とおっしゃっているので、 $_には改行(\n)を含む文字列が入っているんですよね? 正規表現でオプションを何もつけないと「.」は「改行を含まない任意の文字」の意味になります。なので「改行を含む任意の文字」にするため(複数行モード?)に、オプションsをくっつけます。 さらに(.*?)の「?」は最小マッチといって、「.*」の正規表現を満たす最小マッチだけ取得します。「.*」は任意文字の0以上の繰り返しを意味しますから、この最小マッチは「任意の文字の0回の繰り返し」つまり何も無いものがマッチしてしまうので$1には何もきません。(?についてはあまりしらないのでもしかしたらこの解説は違うかもしれません) なのでこの?もとってやりましょう。つまり、 $shou=$1 if/\{第1章\}(.*)/s; が正しい記述になります。

CAL5
質問者

お礼

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

  • 変数の中の文字列から特定の文字の数を数え

    宜しくお願いします。 変数「$koumoku」の中に「1-1」や「1-2-3」といった文字列が格納されているとします。この中のハイフンの数を数えてそれぞれ別の表示をさせたいと思います。 $kosuu=$koumokuの中のハイフンを数える if($kosuu eq 1){(1)を表示} elsif($kosuu eq 2){(2)を表示} elsif($kosuu eq 3){(3)を表示} ~~ この「$koumokuの中のハイフンを数える」と言うのはどのようにしたら良いでしょうか? ちなみに、$koumokuには数字とハイフンしか入りません。

    • ベストアンサー
    • Perl
  • string型よりVariant型 変数に格納

    VBAで string型よりVariant型の方が、 変数に格納できる文字数は多いですか?

  • 変数内の特定の文字の数を数えたい

    パール初心者です。 基礎的なことは知っています。フリーCGIのある程度の改造は出来ますが、自作は出来ません。 質問は変数の中にある特定の文字の個数をカウントする方法です。 変数 $abc="01_01_01" があるとします。 この変数の_(アンダースコア)の数を数えたいのです。 _の数を数えて2個以上ある場合、別の処理をさせたいと考えています。 パターンマッチ演算子を使えばいいのだと思うのですが、私の知識ではよくわかりませんでした。 初心者にもわかりやすい説明で教えてください。 お願いします。

    • ベストアンサー
    • Perl
  • WindowsServer2003の文字数限界はいくつでしょうか?

    OS上でファイルやフォルダを作成する為の限界文字数(フルパスの文字数)はいくつなのでしょうか? OSにより違いはあるけど、大体256文字程度だと聞いているんですが、 ドライブ直下(d:\)に文字の長いフォルダを作成したら合計で247文字で入力ができなくなりました。 そのフォルダ下にはファイルが作成できなかったので、WindowsServer2003のフルパス文字数限界は247文字でしょうか? ご存知の方はアドバイスをお願いいたします。

  • 配列にある文字列を1つの変数に改行付きで格納する方法

    配列にある文字列を1つの変数に改行付きで格納する方法 Array ( [0] => レタス [1] => トマト [2] => きゅうり ) などの配列を $yasai 変数へ ------ レタス トマト きゅうり ------ と格納してテキスト表示させたいのですが、どのようにすれば可能でしょうか? そもそも可能なのでしょうか?ご存知の方、いらっしゃいましたら宜しくお願いします。

    • ベストアンサー
    • PHP
  • 変数に格納されている特定の文字列のフィールド番号を抜き出したいと考えて

    変数に格納されている特定の文字列のフィールド番号を抜き出したいと考えております。 お世話になります。 現在、変数に格納されている特定の文字列のフィールド番号を抜き出したいと考えております。 例として下記名前を指定した変数が有るとします。 NAMEFILE="愛 麻衣 美衣 魔印" このとき「美衣」をgrepすると「3」を言う数値を返したいと考えております。 色々探して「match関数の RSTART」にて行いたい事と近い事が出来たのですが、 開始文字を抜き出す為、かえってくる数値は「6」となってしまいます。 行いたい事として、この場合区切り文字をスペースとし左側から数を抜き出したいのですが 何か良い情報は有りませんでしょうか。 知恵をお借りできたらと存じます。よろしくお願い致します。

  • ウォッチ式の文字数制限について

    Visual Basic 6.0を使っています☆ デバッグ中にウォッチ式というウィンドウを開いて変数の中身をみているのんですけど、SQLを格納しているString型の変数を見ても240文字ぐらいしか表示されません。 本当なら800文字程度あるはずなのですが・・・。 ウォッチ式の中で表示できる文字数に制限があるんでしょうか? もしあるならそれを表示文字数を増やす方法とかってあるんでしょうか? 困っているので、どなたかわかる方がいらっしゃったら教えて頂けませんか?

  • 文字数の正規表現について

    perlであるフォームから数字だけ(4桁)入力してもし4個以外の文字だったらエラー表示としたいのですが if($valueが4個の文字数でないとき){エラー} とした場合($valueが4個の文字数でないとき)の部分はどのように表現す れば良いでしょうか?

    • ベストアンサー
    • CGI
  • セルに入力できる最大文字数

    EXCELが表計算ソフトであることは認識しているのですが、ある目的で日本語文章を1つのセルの中に詰め込んでいます。正確に文字数を数えたわけではありませんが860文字から1100文字あたり(一定しません)まではきちんとセルの中に納まります。ところがそれを超えると、セルの中には納まりません(そのように見える)が入力した文字は消えないで残っています。ただし一度に見えないだけです。 (1)一体、セルの中には最大いくらの文字数が入力できるのでしょうか? (2)また、表示されない文字(見えない文字)を見えるようにするためにはどうすればよいでしょうか? (3)さらに見えなくなる限界(860字あたりから1100字)が一定でないのはどうしてでしょうか? よろしくご教授お願いします。

  • DOSコマンドで結果として出力される文字列を変数に格納したい

    DOSコマンドで、あるソフト(タスク)が実行されていればプログラムAを、そうでなければプログラムBを実行するバッチを組んでいます。タスクの一覧はtasklistで取得できることが分かり、対象となるタスクおみを抽出する方法も分かりました。しかし、この後どうすれば良いかが分かりません。対象となるタスクが存在した場合としない場合では出力される文字列が違います。この文字列を比較することで分岐が実現できると思ったのですが、それには文字列を変数に格納する必要があります。以下のように記述し、うまくいくことを期待したのですが、駄目でした。 set STATUS=tasklist /fi "Imagename eq タスク名" tasklist /fi "Imagename eq タスク名"の部分が関数であれば、戻り値があってそれを格納することができるのではないかと思ったのですが、できませんでした。このケースに限ったことではありませんが、各コマンドの実行結果として出力される文字列を変数に格納するにはどうすれば良いのでしょうか?VBSやWSHなどではなく、.bat形式の場合でお願いします。

専門家に質問してみよう