ウォッチ漫画『酒男子』新連載開始!

perlのシングルクォートとダブルクォートの置き換えについて
お世話になります。
現在、perlにて開発を行っているのですが、一つ問題に当たってしまいました。問題になっているのは、文字列を扱う部分です。perlにおいて文字列はシングルクォートに囲まれたものと、ダブルクォートに囲まれたものがあると思うのですが、この両者の違いは、内部に書かれた変数等を展開するか否かだったと思います。
実は開発の途中でこのシングルクォートで囲まれた文字列を、ダブルクォートに囲まれた文字列に変更しなければいけなくなりました。つまり

$test = 'aaa';
 を 
$test = "aaa";

としたいのです。これってperlの仕様的に可能なのでしょうか? かなり悩んだのですが、どうしてもわかりませんでした。

ちなみに、なぜこの処理が必要なのかというと、HPの製作をしているのですが、設置したフォームからその内容を得るというプログラムを書いた際に、そのフォームの内容がシングルクォートでしか得られないからです。シングルだとそののちの処理に影響が出てしまうのです。
だれかご存じないでしょうか。よろしくおねがいします。

このQ&Aに関連する最新のQ&A

A 回答 (8件)

入れ違いで補足が入っていましたが


・この$subjectなら、"と'に違いは出ないと思います。

・「$subjectの文字列の"と'が問題」としているが、$subjectが使われている様子が無い。
$cmp_subject変数が関係していそうだが、提示された文には入っていない。

・絵文字変換用の文字列の確認が不十分。
以下のものは全部index関数が>=0となりsub emoji_tblで処理される
<#001(セミコロンで終ってない)→$moji_num='<#001'
<#0011;(一桁多い)→$moji_num='<#001'
<#001;(一桁少ない)→$moji_num='<#01;'
<#あa;(そもそも数字ではない)→$moji_num='<#あa'(Shift_JIS,EUC-JP等の全角=2Byteの場合)

emoji_tblが、エラーの場合に何がreturnされるかが提示されていないので、これらの文字列が入った場合にどうなるか不明
下手すれば、whileが無限ループになります。

・そもそも、emoji_tblの作り方も問題
グローバル変数$moji_numで変換対象を渡しているけど、 呼出は&emoji_tbl($moji_num)として、sub emoji_tblで $_[0]で受けるのが普通。

あと、このifの羅列、私は正しく作る自信も、正しくできているか確認できる自信もありません。
例えば、
if( $calia eq 'Docomo'){..が一箇所手がすべってif( $calia eq 'docomo'){..となっていたり
上からコピー&ペーストした後の $moji_cnv = ..の変更を忘れて重複したり
があっても、なかなか気づけないでしょう。



emoji_tblの作り方を見て思ったのですが、グローバル変数を多用している(というかローカル変数を使っていない)様に思われます。
設定したつもりの変数が別の箇所で書き変わってしまっている、ということは無いでしょうか。
    • good
    • 0
この回答へのお礼

自己解決済みですが、詳しいご指摘などをくれたので、ベストにしました。ありがとうございます。
確かに、テーブルの作りはかなり無理やりです。perlを覚えながら急いで開発しなければいけなかったので、ぶっつけ本番でやっている感じです。取りあえず動けばいいみたいな……でもどちらにせよこのあたりで躓くのなら、今のうちに修正しようと思います。ありがとうございました

お礼日時:2010/08/05 17:50

僕も他の人がいってるいるように、問題点を見誤っていると思います。



とりあえず、日本語を扱う場合は、ダブルクォートよりも シングルクォートを使った方が何かと都合がよいので
なるべくならダブルクォートの利用はさけたいところです。
# とくにShift_JISだったりすると全角の空白や表示といった単語すら使えません

んで、下の回答に出ているソースコードはまるで関係ないところがのっていますね。
$subjectに問題があるというならば、その変数が利用されている部分を抜粋するべきです。

ところで、結果的に現象としてどんな状況なのでしょうか?
エラーや不都合があって質問する場合、今の結果と修正後に期待する結果を提示しておくと
スムーズによい回答がもらえると思います。

現象を書くだけでも経験で回答できる人もいるでしょうし。
    • good
    • 0
この回答へのお礼

既に自己解決してしまったのですが、指摘等をしてくれてありがとうございます。
実はまだperlの仕様がよくわかっていません。。。急ぎの開発で覚えながら作っている感じです。次に質問する際は、理想結果等も書くようにします。

お礼日時:2010/08/05 17:48

すでに解決済みならよいのですが。



perlから見た場合、変数展開がなければ、'<#001;絵文字<#002;' と "<#001;絵文字<#002;"は同じです。
スカラ変数に入るのはどちらも「<#001;絵文字<#002;」(前後のクォートを除いたもの)になります。

デバッグ中に
>$subject="<#001;絵文字入り題名<#002;"
ではなくて、あえて、
$subject='<#001;絵文字入り題名<#002;'
でもきちんと動きませんか?

フォームから、意図した文字列(「<#001;絵文字<#002;」)が取得できていないような気がします。
    • good
    • 0

私も #3 と同じく, 何を言っているのかさっぱりわかりません.


そもそも「フォームの内容がシングルクォートで得られる」って, どういう状態なんだろう? 外部から得られるデータに「シングルクォート」も「ダブルクォート」もないんだが....
「フォームから受け取った情報を Perl スクリプトに埋め込み, できたスクリプトを改めて実行する」とかいうまわりくどい方法を考えない限りここの問題ではないと判断するのが妥当だと思う.
あと, 多分現状の置換処理は「正規表現+ハッシュ+α」でほぼ一瞬. データを用意しておけば正規表現で置換して終わり. でも, calia って何だ?
    • good
    • 0

>先頭にある、$subject='<#001;絵文字入り題名<#002;';が問題になっている文字列で、これをデバッグで $subject="<#001;絵文字入り題名<#002;";にすると問題は解決されます。


だからシングルをダブルに置き換えたいのですが。。。駄目でしょうか。

???
引用符を「 " 」にすれば問題が起こらないんでしょ?
だったら「 " 」にすれば良いんじゃない?
なにを困っているのかが全く分かりません。

もしかしてプレフィクス($ や @ や %)を含まない値(展開する必要のないデータ)に「 " 」を使用しても良いのか分からないよママンって事なのでしょうか?
そんなもんは試してみれば一発で分かる事で、悩むような事じゃないと思うのですが…
    • good
    • 0

> これってperlの仕様的に可能なのでしょうか?



は、展開を除けば可能。
$とか@とかがあったら、\でクオートする必要あり

なのですが...

> ちなみに、なぜこの処理が必要なのかというと、HPの製作をしているのですが、設置したフォームからその内容を得るというプログラムを書いた際に、そのフォームの内容がシングルクォートでしか得られないからです。シングルだとそののちの処理に影響が出てしまうのです

>変数展開はないのですが、フォーム内容をメールとして送信しているので、コード変換の際に文字化けが起きてしまうのです。それを防ぐ関数にフォーム内容を送って編集しているのですが、その段階でシングルだと文字列そのものが消されてしまうようなのです。ダブルだと問題なく動作します。

これが、何言ってるのかさっぱりわかりません。
>$test = 'aaa';

>$test = "aaa";
もPerlにとっては「aaa」という文字列です。
元がダブルだったかシングルだったかはわかりません。

その変換関数のロジックをよく確認してはどうでしょう?

「$test = 'aaa';」がヒアドキュメントの一部だとか、htmlの出力が value='text'だとだめでvalue="text" だと大丈夫、とかいうオチじゃないですよね?
    • good
    • 0

>これってperlの仕様的に可能なのでしょうか?



と訊かれれば、「可能です」。

でもプログラム的に影響があるかどうかはプログラム読まないとわかりません。
心配なら一通り動作検証すれば良いのではないでしょうか。
文面からするとさほど複雑なプログラムではないようですし。

この回答への補足

実はデコメを送信するページの作成で、かなり大きなプログラムとなっています。複雑化してきて簡単には全部説明できそうにないので、問題になっている部分だけ書きます。

~~~~~~~ここから~~~~~~~~~~~

$subject='<#001;絵文字入り題名<#002;'; # <#は絵文字判別記号 実際にはフォームから受け取っている

$num = 0;
$ken = '<#';
#テーブルに沿って置き換え開始
while ($num != -1){
$num = index($cmp_subject, $ken);
if(-1 != $num){
$moji_num = substr($cmp_subject,$num,5);
$moji_cnv_tbl = &emoji_tbl;
substr($cmp_subject,$num,6) = $moji_cnv_tbl;
}
}
sub emoji_tbl {
if( $moji_num eq '<#001'){
if( $calia eq 'Docomo'){$moji_cnv = "\xF8\x9F";}
elsif( $calia eq 'EZweb'){$moji_cnv = 'EB60';}
elsif( $calia eq 'SoftBank'){$moji_cnv = "\x1b\$Gj\x0f";}
}elsif( $moji_num eq '<#002'){
if( $calia eq 'Docomo'){$moji_cnv = "\xF8\xA0";}
elsif( $calia eq 'EZweb'){$moji_cnv = 'EB65';}
elsif( $calia eq 'SoftBank'){$moji_cnv = "\x1b\$Gi\x0f";}
}elsif( $moji_num eq '<#003'){
~~~~~~~~~~~~~省略します~~~~~~~~~~~~
return $moji_cnv;
}

~~~~~~~~~ここまで~~~~~~~~

こんな感じです。
先頭にある、$subject='<#001;絵文字入り題名<#002;';が問題になっている文字列で、これをデバッグで $subject="<#001;絵文字入り題名<#002;";にすると問題は解決されます。
だからシングルをダブルに置き換えたいのですが。。。駄目でしょうか。
よろしくお願いします

補足日時:2010/07/30 19:00
    • good
    • 0

変数展開がなければ・・・どちらも同じ結果になります。

この回答への補足

変数展開はないのですが、フォーム内容をメールとして送信しているので、コード変換の際に文字化けが起きてしまうのです。それを防ぐ関数にフォーム内容を送って編集しているのですが、その段階でシングルだと文字列そのものが消されてしまうようなのです。ダブルだと問題なく動作します。

補足日時:2010/07/30 17:56
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qダブルクォーテーションの削除(置換)

$a = qq/"aaaaaa","bbbbb"/;
print $a;
→ "aaaaa","bbbbb"

としたときの、変数 $a の中にある
ダブルクォーテーションを削除したいのですが、

$a =~ s/"//;
では何も変化が無くて、

$a =~ tr/"/ /;
では半角スペースに置換できるのですが、

$a =~ tr/"//;
では何も変化がありません。

上手く出来る方法はどの様な方法でしょうか?
教えていただければありがたいです。

よろしくお願いいたします。

Aベストアンサー

$a =~ s/"//;
とした時には
→aaaaa","bbbbb"
という風に一つ目の「"」だけは無くなっていませんか?
$a =~ s/"//g;
とすれば全ての「"」を削除できます。

また、tr///を使う時には、
$a =~ tr/"//d;
とすれば変換先リストに無い文字を削除できます・

参考URL:http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k08.htm

Q日付の比較について

いつもお世話になります。
ファイルに記述された日付に7日を加算した値とlocationtimeで取得した値を比較したいのですが、記述方法が分かりません。
<ファイルは下記のようになっております。>
2006<>03<>28<>明細
これに7を加算した(7日後という意味です)locationtimeでreturn "$year/$mon/$day";の戻り値と比較した比較したいのですが、
どのようにしたらよいのでしょうか?
どなたかご教示お願いいたします。

Aベストアンサー

# あ、こういうことですか?
# まだ違ってたりして・・

use strict;

my $date1='20060328';
my $date2='2006/04/05';
$date2=~ s{\/}{}g;

if($date1 <= $date2){
print '$date1 <= $date2';
}else{
print 'else';
}

Qpingでポートの指定

pingでIPアドレスを指定して、通信できるかどうかというのは
よく使いますが、pingでポートを指定して応答するかどうかは調べられるのでしょうか?

よろしくお願いします

Aベストアンサー

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含むICMP)ではできません。

FTPの疎通確認であれば、クライアントからサーバに対するTCP/21通信(FTP-CMD)が可能であること(サーバからクライアントへのTCP/21からの応答を含む)+サーバからクライアントに対するTCP/20通信(FTP-DATA)が可能であること(クライアントからサーバへのTCP/21からの応答を含む)が必要でしょう。

監視ソフトによるものであれば、
・クライアントからサーバへのログイン(TCP/21)
・クライアントからサーバへのlsの結果(TCP/20)
で確認すればよいでしょう。

pingを含むICMPというプロトコルは、OSIの7レイヤで言うところのL2(同一セグメント内通信)とL3(IPルーティングされた通信)の両方にまたがる、ちょっと珍しいプロトコルです。

IPアドレスは指定できますが、別サブネットに属するIPアドレスに到達できればL3通信、できなければゲートウェイと呼ばれる同一サブネットに属する中継装置からの回答を得るという点でL2(MAC通信ではなく、同一セグメント内通信という意味)通信です。

ポート番号はL4で使用されるアドレスですから、L4機能の疎通確認はping(を含む...続きを読む


人気Q&Aランキング