- 締切済み
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"; } -------------------- ★★が入ってる場合はうまくいくのですが、入っていない場合うまくいきません。 (結果が表示されない) どこを直したらいいのでしょうか?
- みんなの回答 (6)
- 専門家の回答
みんなの回答
- arukamun
- ベストアンサー率35% (842/2394)
No.2のarukamunです。 >回答ありがとうございます。 >「そうか、その手があった!」とやってみたんです>が、/\/とやるとエラーになってしまうみたいで… >無理やり「/'\'/」としてみたんですが、冒頭の\\し>か認識してないみたいです。 >どのようにすればすべての\が認識されるでしょうか? すみません、かなりぼけていたみたいです。 すべての\マークで分割して配列に入れるので//の後にgが必要でした。また\マークも'\'または\\に置き換えて確認してください。 @DIR = split /'\'/g,$FILENAME1 ; $FILENAME = pop @DIR ; または @DIR = split /\\/g,$FILENAME1 ; $FILENAME = pop @DIR ;
- mrumesuke
- ベストアンサー率45% (254/557)
# ※補足※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)
>転記ミスです、すいません。 >実際は1がちゃんとついています。 >(★★が入ってた場合はきちんと表示されますし…) else{}は★★がない場合の処理ですから、★★が入ってる場合に表示されるからと言ってelse{}にミスがない理由にはなりませんよ。 もう一度よくご確認された方がよろしいかと思います。
- tyd3
- ベストアンサー率55% (53/96)
単純に質問事項のロジックだけであれば、 最後のelse文 >print "$FILENAME<BR>\n"; が、単純に$FILENAME1の誤記です。
- arukamun
- ベストアンサー率35% (842/2394)
フルパスからファイル名だけを取り出す方法として @DIR = split /\/,$FILENAME1 ; $FILENAME = pop @DIR ; で良いような気がしますが、当方の環境にplが動作するマシンが無く、確認出来ません。 ご確認下さい。
お礼
回答ありがとうございます。 「そうか、その手があった!」とやってみたんですが、/\/とやるとエラーになってしまうみたいで… 無理やり「/'\'/」としてみたんですが、冒頭の\\しか認識してないみたいです。 どのようにすればすべての\が認識されるでしょうか?
- kosa
- ベストアンサー率25% (379/1464)
ヒアドキュメントで出力してはどうですか? ※あのモジュールは結構いっぱい入っていてお得ですよ
お礼
回答ありがとうございます。 ヒアドキュメントで出力しちゃうとHTMLになってしまいますよね? そこに行くまでというか、それができないんです… ありがとうございました。
お礼
回答ありがとうございます。 転記ミスです、すいません。 実際は1がちゃんとついています。 (★★が入ってた場合はきちんと表示されますし…) 他に何かご指摘いただけるところはないでしょうか?