• ベストアンサー

アルゴリズム解析をしてるのですが…

いくつかのperlを解説したページを読んでみたのですが、 以下の文でフォーマットとしての"%02x"の意味と 「^」(演算子?)の意味がわからずつまづいてます。 $val =~ s/./sprintf("%02x",ord($&)^ord($aaa[$i++ % @aaa])))/ge どなたか教えてください・・・

  • izk13
  • お礼率30% (3/10)
  • Perl
  • 回答数2
  • ありがとう数8

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

  • ベストアンサー
  • shigatsu
  • ベストアンサー率26% (511/1924)
回答No.1

これは出力のフォーマットですね。 まず x は16進数の小文字を出力する指示。その前の02ってには「左側にゼロを詰めた2桁」って意味です。 Cのリファレンスを探して printf の書式を調べてみてください。 検索してたらPHPのがヒットしましたが、意味は同じです。>参考URL

参考URL:
http://www.asakawa.ne.jp/doc/php/ja/sjis/function.sprintf.html
izk13
質問者

お礼

ありがとうございます。 Cと同じ意味なんですね。 左側に0を詰めた2桁ですか、なるほど。

その他の回答 (1)

  • AKIIRA
  • ベストアンサー率38% (15/39)
回答No.2

"%02x"についてはshigatsuさんが書いているとおりなので省略。 「^」は排他的論理和を表すビット論理演算子です。 この説明でわからなければ、コメントで補足してください。

izk13
質問者

お礼

ありがとうございます。 xorですね。 perlだと[^ABC]などとしたときに意味が違ってくるので、 何か複雑に考えてしまったようです。

関連するQ&A

  • phpの日本語変換

    perl で日本語を下記のコードで変換しています $fname =~ s/(\W)/sprintf("%%%02X", ord($1))/ego; PHPからperlへの変換のコードがわかりませんよろしくお願いします。

    • ベストアンサー
    • PHP
  • Perl初心者ですが

    Perl初心者ですが、次の内容を説明してください。 $Word =~ s/(\W)/$escape{$1} ||= sprintf("%%%02X", ord($1))/eg;

    • ベストアンサー
    • Perl
  • [Perl] unpackで不要文字にエンコード

    Perl CGIについてです。 文字列をエンコードしようと次のようにしてみました。 $val1 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $val2 =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg; $va1は問題なくエンコードされ、デコードも元文字に戻ったのですが、 $va2のエンコード文字に不要な'25'が含まれるようになってしまいました。 例:「ガム」をエンコード >> %A5%AC%A5%E0  を期待していたのですが、結果は %25A5%25AC%25A5%25E0 と不要に'25'が含まれてしまいました。unpackの文が悪いのでしょうか?ご教示ください。

    • ベストアンサー
    • CGI
  • ひらがなから全角カタカナへの変換の仕方

    Perlでひらがなから全角カタカナへの変換の仕方について教えてください。 ここのサイトで「全角カタカナからひらがなへの変換」の仕方が書いてありました。コレを元に逆に指定すれば出来るかな?って思ったのですが。。。どうやればいいのか全くわかりません。たぶんですが文字コードなどで指定しているとは思うのですが。。。どなたかわかる方がいましたら教えて下さい。よろしくお願いします。 #全角カタカナからひらがなへの変換の仕方 $a =~ s/(\x83)([\x40-\x7e])/"\x82".sprintf("%c",ord($2)+0x5f)/eg; $a =~ s/(\x83)([\x80-\x96])/"\x82".sprintf("%c",ord($2)+0x5e)/eg; 上記の逆に「ひらがなから全角カタカナへの変換」出来るようにしたいです。よろしく御願いします。

    • ベストアンサー
    • Perl
  • 日本語のエンコード

    日本語 秘華をPHPでエンコードすると $fname = "秘華"; $name = rawurlencode( $fname ); %94%E9%89%D8 になり Perlで 秘華をPHPでエンコードすると $fname =~ s/(\W)/sprintf("%%%02X", ord($1))/ego; %20%94%E9%89%D8 になります PHPエンコードを%20%94%E9%89%D8 になるにはどのようにすべきですか よろしくお願いします。

    • ベストアンサー
    • PHP
  • C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに

    C言語の勉強をしていて、for文と戻り値を使った階乗について分からずに困っています。 以下の点に留意して、階乗を計算するプログラムを作成する。 階乗とは、数字を1つづつ減らしながら掛け合わせたものです。つまり 5の階乗:5×4×3×2×1=120 3の階乗:3×2×1=6 となります。 main内 1)整数型の変数kazu、kekkaを宣言する。 2)“階乗を計算します。”を表示する。 3)実行例と同様の表示になるように、“整数を入力してください”を表示し、入力された値を、変数kazuに読み込む。 4)作成する関数名は、kaijyoとし、kazuを引数とし、戻り値をkekka に代入する。 6)“○の階乗は ○です。”と表示する。 関数kaijyo内 1)引数を変数名xとする。 2)整数型の変数i、valを宣言する。 3)計算結果をvalに入れていくために、valを初期化する(下記注意参照)。 4)iをカウンターとするfor文と複合代入演算子を使って階乗を計算する。 5)valの内容が戻り値となるようにする。 注意:階乗を計算するために、for文の中で複合代入演算子を使って階乗を計算します。しかし、for文に入る前のvalの初期化には注意が必要です。0に何を何回かけても0だと言うことを思い出してください。 という問題です。 それで私は下の通りに作りました。 #include <stdio.h> int kaijyo(int x); void main(void) { int kazu,kekka,kaijyo,sum; printf("階乗を計算します。\n"); printf("整数を入力してください"); scanf("%d",&kazu); kekka=kaijyo(kazu); printf("%dの階乗は%dです。",kazu,kekka); } int kaijyo(int x) { int i,val; val=1; x=1; for(i=1;i<=val;i++){ x=x*i; } return val; } しかし、メイクして実行してもどの階乗でも256になってしまいます。 どこが間違っているのか分からずに困っています。 よかったら教えてください。 よろしくお願いします。 カテゴリを間違ってしまっていたらすみません。

  • string型のフォーマット書式指定の文字列

    char s[20]; sprintf(s, "%c%c%c", 0x40, 0x41, 0x00); と同じことを string型を使って書式フォーマットしたいのですが string ss; からどうすれば、上のようなことができるのでしょうか?

  • アルゴリズムのフローチャート(ヒストグラム)

    0以上10以下の整数を入力として繰り返し受けつけ、階級の幅が3であるようなヒストグラムを出力する。 終了記号は-1とする。     始     ↓    i←0 ↑→→↓ ↑  X[i]←0 ↑   ↓ ↑←←i≧4  NO ↓     ↓YES     ↓    入力:N     ↓ ↑→→↓YES ↑   ↓ ↑  N=-1 →YES→出力:X→終 ↑   ↓ ↑   ↓NO ↑   ↓ ↑  N←N/3 ↑   ↓ ↑  X[N]←X[N]+1 ↑   ↓ ↑←←↓ 見にくい図で申し訳ありません。 このようなフローチャートがあるのですが、全体の流れの意味がよくわかりません。 特に後半の「N←N/3」以降はどういった意味なのでしょうか? よろしければ解説をお願い致します。

  • Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコ

    Perlのcgi-lib.plでデコードされた文字をUTF-8にエンコードするにはどんなコードを書けば良いのでしょうか。 "あ"という文字をHTMLフォームから受取って%82%A0というS-JISのバイトコードに再エンコードするコードを質問したら $a = "あ"; $a =~ s/([^a-zA-Z0-9*\-.@_])/sprintf("%%%02X", ord($1))/eg; $a =~ s/%20/+/g; print $a; という答えを頂きました。コードの意味はよく判らなかったのですが、ちゃんと思惑通り$aは%82%A0になりますので長い間重宝にさせていただいています。 今度は$a="あ";の値をUTF-8の%E3%81%82にエンコードしたいのですが、どのように上記のコードを変更すればよいか教えてください。正規表現というのを使えば出来るのでしょうが、本で読んでもやっぱりわかりません。

    • ベストアンサー
    • CGI
  • javaで電卓を作りたいのですが(Swing

    こんにちは。プログラミング初心者なのでどうかご助言願います。 javaのSwing(JFRAME)で電卓を作ろうとしているのですが、一応動作はするのですが連続計算がうまくいきません たとえば66(画面表示は66)*3(画面表示は3)-(画面表示は198)8(画面表示は8)=190 という計算をさせたいのですが、途中でうまくいってないみたいで 最終的な答えが58、という答えが出てしまいます。(途中はきちんと198と表示されます) 下のメソッドのどこが間違っているかご指摘頂けるとありがたいです int val =0; int val0=0; String op = null; //数字 public void numberreturn(int i){ val=val*10+ i; resultTextField.setText((new Integer(val)).toString()); } //演算子 public void calculate(String x){ if(op==null){ if(val0!=0){ op=x; }else{ val0=val; val=0; op=x;} }else if(val==0){ op=x; }else if(val0!=0){ returning(val0,val,op); op=x; }else{ val0=val; val=0; op=x; } } //結果表示 public void ansreturn(int i){ resultTextField.setText((new Integer(i)).toString()); } //計算を行う関数 public void returning (int i,int j,String x){ if(x!=null){ int k; if(x=="plus"){ k=i+j; } else if(x=="minus"){ k=i-j; } else if(x=="mult"){ k=i*j; } else{ try{ k=i/j; }catch(Exception e){ k=0; } } i=k; ansreturn(i); j=0; x=null; }else{ j=0; x=null; } } ボタンのほうは一応こんな感じです private void minusButtonActionPerformed(java.awt.event.ActionEvent evt) { calculate("minus"); } private void equallButtonActionPerformed(java.awt.event.ActionEvent evt) { returning(val0,val,op); } よろしくお願いします

    • ベストアンサー
    • Java