こんにちは。
下記は、pack関数のサンプルスクリプトですが、
なんでそのような結果になるのか、よくわかりません。どなたか教えていただけますか。
print "文字列を入力してください:";
$string = <STDIN>;
chomp ($string);
$length = length($string);
print "数値を入力してください:";
$number = <STDIN>;
chomp ($number);
# Do Pack!
$packed = pack("A${length}i", $string, $number);
print "パック文字列: $packed\n";
--- 結果 ---
文字列を入力してください:perl
数値を入力してください:100
パック文字列: perl
No.2ベストアンサー
- 回答日時:
Packは複数の変数をひとつにまとめるためのものですね。
書式としては
Pack(テンプレート,変数,変数,......)
となります。
今回の場合はテンプレートは、
A${length}i
ですが、$lengthには$stringの長さですから、$string=perlなら4になるので、
A${length}i = A4i
ですね。
A{n}はn文字分の領域を確保するという意味なので、A4なら4文字分の領域が確保され、そこにperlという文字列が格納されます。
もしこれがA6とかでperlという文字列を格納しようとすると、2文字分余るので余った部分にはスペースが入れられます。
'p','e','r','l'のアスキーコードはそれぞれ16進数で70,65,72,6Cなので$packedには
70 65 72 6C
といった情報が格納されます。
次にiですが、これは32ビット以上の符号付整数型となっています。
PCでperlを動かしているなら、ほとんどが32ビット環境となっていると思うので、これは事実上32ビットと思ってください。
100は16進数であらわすと64ですが、これが32ビット=4バイト整数型に格納されたとすると00000064(0を増やして4バイト分の情報にしているだけ)といった感じになります。
さらにこれがメモリなどに格納される場合には1バイト単位で分解されるわけですが、ビッグエンディアンと呼ばれる形式で格納された場合には順番が反転して、
64 00 00 00
となります。
http://www.atmarkit.co.jp/icd/root/70/5784470.html
A4iでこの二つのデータが結合されますから、結果としては
70 65 72 6C 64 00 00 00
となり、これをprintで表示すると、アスキーコードにしたがって、
perld
となります。
後ろの3つの00はNULL文字なので見えません。
ちなみに符号有り、符号無しというのは負の値を使うか、使わないかということです。
たとえば1バイトで表現できるのは256個の数字ですが、符号ありの場合は-128~127の値を、符号無しの場合は0~255の値を表すことができます。
大変親切かつ丁寧にご説明いただき、どうもありがとうございます。
目からウロコのような解説です。
ぼくだけでなく、ぼくと同じ疑問を抱いているかも知れない人たちにもぜひ詳細したいくらい、大変よく理解できました。
もしよろしければ、今後も教えていただけたらと思います。
本当にどうもありがとうございます。
No.1
- 回答日時:
実行結果って、
パック文字列: perld
――じゃありませんか?
もしそうなってないなら、表示が崩れているだけでは。
そういう話じゃなくて、「そもそもpackって何?」という話だとしたら、メモリへの値の直接書き込んでいるイメージがわかないと、ピンとこないかも。
この回答への補足
こんにちは。この度はどうもありがとうございます。
ご指摘とおり、実行結果は、「perld」です。
すみませんでした。
そうですね、。。「そもそもpackって何?」ってところが理解できてないんだと思います。
参考書には、「符号無しのchar型」など説明されていますが、ピンとこないのが正直なところですね。
よろしかったら、「packって何をするためのもの?」について教えていただけたら嬉しいです。
よろしくお願いいたします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) python質問 1 2023/08/14 11:54
- Java Javaの問題なのですが、「3文字以上の英数字文字列を入力し、文字列の中に文字(9)が出てくるまでの 1 2023/06/06 18:55
- Perl perlについての質問 2 2022/10/17 15:25
- Visual Basic(VBA) 入力ボックスが繰り返しポップアップして止まらない。 下記コードでファイル名の変更をしたいのですが、変 1 2022/09/08 11:27
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) 以下のVBAで該当文字列の前後に付与したい。 例 前に付与 abc ユーザーID 12345 後に付 3 2022/04/19 21:50
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- その他(プログラミング・Web制作) awkのtoupper() 1 2022/10/21 20:39
- Java java 入力された文字列を数値に置き換えて整数にし、計算をしたいです。 <を10として /を1とし 4 2022/05/16 21:08
- UNIX・Linux 次の要件を満たすにはどのように修正したらよろしいでしょうか 1 2022/11/24 20:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
パイソンエラーについて
-
perlを使用しての特定行抽出に...
-
Malformed UTF-8 character
-
Perlで Right関数に近い処理を...
-
CSVファイルの中で、「 , 」カ...
-
エクセルで数値を全角文字(カ...
-
英数字のみ全角から半角に変換
-
プログラミングでは、半角括弧...
-
IEからEdgeへの移行に伴うIMEの...
-
VBA 置換文字がみつからない時
-
「何とかで始まり、何とかで終...
-
CString から LPCTSTRの型に変換
-
Excel VBAでPDFファイルをMicro...
-
エクセルにMicrosoft Barcode C...
-
csvデータ ダブルクォーテ...
-
カンマ区切りの数字をCSVフ...
-
EXCELからCSVにすると余計なカ...
-
word差し込み印刷 半角カタカ...
-
SJIS->UTF8->SJISコード変換に...
-
正規表現で、特定の文字列を含...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
パイソンエラーについて
-
Malformed UTF-8 character
-
Perlで Right関数に近い処理を...
-
splitの逆の処理
-
GDBでデバッグするとき文字列の...
-
数字を文字列に変換し短縮化する
-
文字列と数字を含むセルから数...
-
日本語文字列の指定長(byte)切出し
-
メールヘッダのMIMEエンコード...
-
Perl(Windows)の文法について
-
プログラミング HSPの変数につ...
-
VBA like演算子について
-
Perl/Tk使用時のUTF-8コード文...
-
perlを使用しての特定行抽出に...
-
perlでのURL判定
-
perlで文字列を短く(圧縮)し...
-
cryptの使用方法
-
外部ファイルに「漢字(かんじ...
-
リストデータの検索でのエラー...
-
文字列操作:最後の4文字を取...
おすすめ情報