• ベストアンサー

Perlのデータ変換

Perlでデータの変換で方法がわからず、悩んでおります。 $moji_1 = "A5A2A5B9A5D9A5B9A5C8"; ↑ ↓ @moji_2 = (0xA5, 0xA2, 0xA5, 0xB9, 0xA5, 0xD9, 0xA5, 0xB9, 0xA5, 0xC8); それぞれを変換するスマートな(関数や1行程度)でできる方法が知りたいのですが わかりません。 packやunpack?を使えば、できるということでしょうか? perlの取得がなかなかできずに悩んでおります。 Cがポインタが理解できれば初級をクリアしたといわれますが、 Perlの場合は、何をクリアすれば、初心者をクリアしたとなりますか? 皆さんの意見が知りたいです。 初級 中級 上級 達人 仙人 創始者 Perlを作った人 . . .

  • Perl
  • 回答数3
  • ありがとう数0

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

  • ベストアンサー
  • ximt397
  • ベストアンサー率75% (3/4)
回答No.3

buffalomasaさんの回答では、うまくできないと思いますよ。 ■ $moji_1 ⇒ @moji_2 @moji_2 = map{hex($_)}$moji_1=~/(..)/g; ■ @moji2 ⇒ $moji_1 $moji_1 = join('',map{sprintf('%02X',$_)}@moji_2); 配列、ハッシュ、リファレンスを自由に使いこなせるようになったら初心者脱出ではないでしょうか。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

#本当は、文字長や配列のサイズを調べないといけないけど省略 #@→$ @moji_2 = (0xA5, 0xA2, 0xA5, 0xB9, 0xA5, 0xD9, 0xA5, 0xB9, 0xA5, 0xC8); $moji_1=uc(unpack("H20",pack("C10",@moji_2))); print $moji_1 . "\n"; #点検 #$→@ @moji_2=unpack("C10",pack("H20",$moji_1)); foreach $x (@moji_2){ #点検 print sprintf "%02X\n",$x; }

回答No.1

#!/usr/local/bin/perl $moji_1 = "A5A2A5B9A5D9A5B9A5C8"; @moji_2 = map { "0x$_" } $moji_1 =~ /(.\d)/g; これでどうでしょうか? Perlの場合、一番ややこしいのが正規表現だと思います。それを一通り使いこなせればまあ、Perlを使えると言えるのではないでしょうか?

関連するQ&A

  • Perl 文字変換

    Perlで全角英数字を半角英数字に変換させたいのですが、 Jcodeを使わずにできる方法を教えてほしいです。 例えば zenkaku→zenkaku のようにです。 $value=~ s/$a\xA3([\xB0-\xB9\xC1-\xDA\xE1-\xFA])$b/pack("C", ord($1) - 0x80)/oeg; こういうのを試してみたのですが、上手く行きませんでした・・・

    • ベストアンサー
    • Perl
  • 点と直線に関する質問

    点A,Bを結ぶ直線ABと、直線AB上に無い点Cがあり、点Cから直線ABへ下ろした垂線Lと、直線ABとの交点Dを求める方法に関する質問です。 当方は、座標に経度・緯度を使っており、点A,B,Cの座標(位置情報)は既知です。まず、点A,Bを結ぶ直線を求め、次にその直線と垂直に交わる直線の傾きbを求め、傾きbで点Cを通る直線と直線ABとの交点を求め、点Dとしました。しかし、求めた点Dを地図ソフト(SIS)上にプロットしてみると、かなりのずれ(50~100m)が生じてしまいました。 距離は数十~数百メートル程度のオーダーです。 点の座標A(XA,YA),B(XB,YB),C(XC,YC),求める点D(XD,YD)とし、ABの傾きa=(YB-YA)/(XB-XA)、ABと垂直に交わる直線の傾きb=-(XB-XA)/(YB-YA)とおくと、点Dの座標は、XD=(a*XA-YB-b*XC+YC)/(a-b),YD=b*(XD-XC)+YCであるとして、求めました。 この問題はやはり球面座標で考えるべきなのでしょうか?当方、球面座標に関しては全くの無知でして、このような時はどのようにして求めればよろしいのでしょうか?式など示して頂ければありがたいですが、何か関連する情報やヒントでも結構ですので、アドバイスの方、どうぞ宜しくお願いします。

  • 座標値を求める計算式が知りたい!

    下図のように、点座標、点A(Xa,Ya)、点B(Xb,Yb)、点C(Xc,Yc)が与えられているとき、D点の座標値、Xd, Ydを求める式を教えてください。

  • 誤算の伝搬式から求まる標準誤差について

    3つの集団A,B,Cがあります。それぞれの集団の平均値(標本平均)をxa,xb,xcとします。その集団の標準偏差をそれぞれΔxa,Δxb,Δxcとします。 3つの標本平均xa,xb,xcの標準誤差(SE)は誤差の伝搬式から SE=√(Δxa^2+Δxb^2+Δxc^2)/3 となります。 しかし、Δxa=Δxb=Δxc=SDとなり SE=SD/√3 となる事がイマイチ理解できません。 なぜ、別々の集団A,B,Cの標準偏差が全て等しくみなせるのでしょうか?

  • Perlのテキストの変換について

    初めて質問します。 Perlを使って下記のようにテキストを変換したいんですけど、やり方を教えてください>< 【変換前】 A 1234 A 2345 B 3456 B 4567 【変換後】 >Af >1234 >As >2345 >Bf >3456 >Bs >4567 というふうに並び変えたいんですけど、なにぶんプログラミング初心者なもので、 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 4点の座標がわかっているときの四角形の面積

    平面上の4点の座標がわかっていれば、四角形の形状は一義的に決まるものでしょうか。もし、きまるものなら、その面積の算出方法について教えてください。 点A(Xa、Ya) 点B(Xb、Yb) 点C(Xc、Yc) 点D(Xd、Yd) とします。 よろしくお願いします。

  • パターンマッチングの限界?(最大文字数)

    perl正規表現のパターンマッチングでは,対象文字列が長すぎると正しくマッチしないというような,perlの仕様あるいはバグが存在するのでしょうか? ■状況 CGIフォームから入力された文字列に機種依存文字(EUC未定義文字)が含まれていないかチェックするため,以下のようなスクリプトを書きました。テストでは,ほとんどの場合は正常に動作しましたが,定義文字=パターンマッチするはずの文字に,未定義文字が含まれていると誤判断されてしまうケースがありました。いろいろ試してみたところ,どうも文字数32,768バイトを超えた場合に限られるようだ,というところまで判りました。 ドキュメントなどを見ても,そのような仕様については見つからず,どなたかご存知ないでしょうか。 あるいはスクリプトに不備があればご指摘いただけたらと思います。 よろしくお願いいたします。 if (&is_undef($input_text)) { print "未定義文字が含まれています。"; } … sub is_undef { my ($text, $character_strict); $text = $_[0]; # EUC-JP文字(定義文字) $character_strict = '(?:[\x20-\x7E]|' # ASCII  . '[\xA1\xB0-\xCE\xD0-\xF3][\xA1-\xFE]|' # 1,16-46,48-83区  . '\xA2[\xA1-\xAE\xBA-\xC1\xCA-\xD0\xDC-\xEA\xF2-\xF9\xFE]|' # 2区  . '\xA3[\xB0-\xB9\xC1-\xDA\xE1-\xFA]|' # 3区  . '\xA4[\xA1-\xF3]|' # 4区  . '\xA5[\xA1-\xF6]|' # 5区  . '\xA6[\xA1-\xB8\xC1-\xD8]|' # 6区  . '\xA7[\xA1-\xC1\xD1-\xF1]|' # 7区  . '\xA8[\xA1-\xC0]|' # 8区  . '\xCF[\xA1-\xD3]|' # 47区  . '\xF4[\xA1-\xA6])'; # 84区 $text =~ s/\r//g; $text =~ s/\n//g; $text =~ s/\t//g; if ($text =~ /^$character_strict*$/) {  return; } else {  return 1; } }

    • ベストアンサー
    • Perl
  • データをCGIに渡す形式に変換する。

    中に入れ子で別のCGIが入っているCGIを考えました。 <iframe ・・・ action="入れ子.cgi?data1=なんたら&data2=かんたら"></iframe> みたいな感じです。 data1とdata2は親のCGIで考えて入れ子のCGIに渡します。 ところでCGIにマルチバイト文字を渡す場合は、何らかの処理をして  %([a-fA-F0-9][a-fA-F0-9]) の形式に変換されます。 これを元に戻す方法が  =~s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; であることは分かったのですが、ならば元の文字列を  %([a-fA-F0-9][a-fA-F0-9]) に変換する方法が  =~s/[^a-fA-F0-9]/unpack("H2", $1)/g; かと思いきや、うまく動きません。 どのように式を書けばいいのでしょうか? #! usr/bin/perl -d use utf8; binmode(STDOUT,'utf8'); our %in=(textfield=>'テスト',submit=>'送信'); foreach(keys %in) { my $unpack=$in{$_}; my $unpack=~s/[^a-fA-F0-9]/unpack("H2", $1)/g; my $pack=$unpack; $pack=~s/%([a-fA-F0-9][a-fA-F0-9])/pack("H2", $1)/eg; print "$_ &nbsp; $in{$_} &nbsp; $unpack &nbsp; $pack <br>\n"; }

    • ベストアンサー
    • 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で16進のデータをたくさんセットするには?

    perlでテストデータを作成したいのですが、やり方がわからず困っています。 やりたいことは、文字変換テーブルがうまく作成できているかを試すための、テストデータ作成で、データとしては16進でx'97A0'からx'9EDF'までの2バイト文字コードのデータをひたすら打ち込んだ、テキストデータを作成することです。 単純にHEXのデータx'97a1'をunpackで10進化したデータに対して、1を足しこみ、それをPACKし直してと言うことをしてみたのですが、結果はx'97a1'で、x'97a2'にはなってくれませんでした。 16進で2バイト文字コードを連番で自動で作るようなことはできないのでしょうか? 作成するテストデータが多いため、できれば自動でしたいと考えたのですが・・・。 試してみたサンプルを以下に記します。 どなたかお知恵をお貸しください。 よろしくお願いいたします。 -------------------------------------------- $data0 = "97a1" $data1 = pack "H4",$data0; $ctrl = pack "H2","0d"; for ($i = 0; $i < 10; $i++) {  $data2 = unpack "H4",$data1 ;  $data5 = $data2++;  $data6 = pack "H4",$data5 ;  print NEWFILE $data6,$ctrl; }

    • ベストアンサー
    • Perl

専門家に質問してみよう