• 締切済み

cgiで文字列操作

文字列$FILENAME1から★★より右側だけ取り出したいのですが、★★がない場合もあるので、 以下のようにしてみました。 -------------------- $FILENAME1 = "*****★★****"; print "文字列は「$FILENAME1」<BR><BR>\n"; $DIR = "★★"; $MOJISUU = length $DIR; print "探す文字列は「$DIR」<BR><BR>\n"; $position = index $FILENAME1,$DIR; print "$DIRの文字位置は「$position」<BR><BR>\n"; if ($position > 0){ $FILENAME = substr($FILENAME1,$position+$MOJISUU); print "$FILENAME<BR>\n"; } else { print "$FILENAME<BR>\n"; } -------------------- ★★が入ってる場合はうまくいくのですが、入っていない場合うまくいきません。 (結果が表示されない) どこを直したらいいのでしょうか?

みんなの回答

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.6

No.2のarukamunです。 >回答ありがとうございます。 >「そうか、その手があった!」とやってみたんです>が、/\/とやるとエラーになってしまうみたいで… >無理やり「/'\'/」としてみたんですが、冒頭の\\し>か認識してないみたいです。 >どのようにすればすべての\が認識されるでしょうか? すみません、かなりぼけていたみたいです。 すべての\マークで分割して配列に入れるので//の後にgが必要でした。また\マークも'\'または\\に置き換えて確認してください。 @DIR = split /'\'/g,$FILENAME1 ; $FILENAME = pop @DIR ; または @DIR = split /\\/g,$FILENAME1 ; $FILENAME = pop @DIR ;

  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.5

# ※補足※KODAMARさんが提示したコードのelseを$FILENAME1に直したら、★★がない場合も結果表示されましたよ。 >/\/とやるとエラーになってしまうみたいで /\/でエラーになるのは、\がエスケープ文字だからです。 単なる文字としての\を扱いたいときは、\\としなくてはなりません。 >ヒアドキュメントで出力しちゃうとHTMLになってしまいますよね? 仰る意味が分かりません。 コンソールで動作確認できますよ。 以上を踏まえ、サブルーチン化したソースを提示します。 レイアウトの都合上、行頭のTABを全角スペースに置き換えています。 ご注意ください。 ---------------------------------------- [test.pl] ---------------------------------------- &getfilename("abc★★def", "★★"); &getfilename("abcdef", "★★"); &getfilename("c:\\temp\\temp.txt", "\\\\"); sub getfilename() {  ($FILENAME1, $DIR) = @_;  @DIR = split /$DIR/,$FILENAME1 ;  $FILENAME = pop @DIR; print <<"END_OF_TEXT" 文字列は「$FILENAME1」<BR><BR> 探す文字列は「$DIR」<BR><BR> $FILENAME<BR> END_OF_TEXT } ---------------------------------------- [コンソール出力結果] ---------------------------------------- 文字列は「abc★★def」<BR><BR> 探す文字列は「★★」<BR><BR> def<BR> 文字列は「abcdef」<BR><BR> 探す文字列は「★★」<BR><BR> abcdef<BR> 文字列は「c:\temp\temp.txt」<BR><BR> 探す文字列は「\\」<BR><BR> temp.txt<BR> ----------------------------------------

  • mrumesuke
  • ベストアンサー率45% (254/557)
回答No.4

>転記ミスです、すいません。 >実際は1がちゃんとついています。 >(★★が入ってた場合はきちんと表示されますし…) else{}は★★がない場合の処理ですから、★★が入ってる場合に表示されるからと言ってelse{}にミスがない理由にはなりませんよ。 もう一度よくご確認された方がよろしいかと思います。

  • tyd3
  • ベストアンサー率55% (53/96)
回答No.3

単純に質問事項のロジックだけであれば、 最後のelse文 >print "$FILENAME<BR>\n"; が、単純に$FILENAME1の誤記です。

KODAMAR
質問者

お礼

回答ありがとうございます。 転記ミスです、すいません。 実際は1がちゃんとついています。 (★★が入ってた場合はきちんと表示されますし…) 他に何かご指摘いただけるところはないでしょうか?

  • arukamun
  • ベストアンサー率35% (842/2394)
回答No.2

フルパスからファイル名だけを取り出す方法として @DIR = split /\/,$FILENAME1 ; $FILENAME = pop @DIR ; で良いような気がしますが、当方の環境にplが動作するマシンが無く、確認出来ません。 ご確認下さい。

KODAMAR
質問者

お礼

回答ありがとうございます。 「そうか、その手があった!」とやってみたんですが、/\/とやるとエラーになってしまうみたいで… 無理やり「/'\'/」としてみたんですが、冒頭の\\しか認識してないみたいです。 どのようにすればすべての\が認識されるでしょうか?

  • kosa
  • ベストアンサー率25% (379/1464)
回答No.1

ヒアドキュメントで出力してはどうですか? ※あのモジュールは結構いっぱい入っていてお得ですよ

KODAMAR
質問者

お礼

回答ありがとうございます。 ヒアドキュメントで出力しちゃうとHTMLになってしまいますよね? そこに行くまでというか、それができないんです… ありがとうございました。

関連するQ&A