ファイルから固定長のレコードを読み込んで、そのレコードから、ある項目をとりだしたいのですが・・・

レコードのフォーマット
  名前 : Ch (8byte)
  金額1: Int(4byte)
  金額2: Int(4byte)
  金額3: Int(4byte)

ここから、金額2を取り出すには、どうしたら?・・・

$kingaku2 = substr($rec, 12, 4);

と、やると、うまくいかない($kingaku2 の Length が 0 になってしまうような・・・)のですが・・・

A 回答 (2件)

Windowsだったら、バイナリモードで開く必要があります。


http://tohoho.wakusei.ne.jp/wwwperl1.htm#Binary

開いた後の分解ですが、unpack 関数はどうでしょう?
http://tohoho.wakusei.ne.jp/wwwperl2.htm#unpack

($namae, $kingaku1, $kingaku2, $kingaku3) = unpack ("a8iii", $rec);

とすればOKだと思います。
確認を取ったコードを記しておきます。

$rec = "NameABC\0\x01\x00\x00\x00\x02\x00\x00\x00\x03\x00\x00\x00";
($namae, $kingaku1, $kingaku2, $kingaku3) = unpack ("a8iii", $rec);
print $namae, "\n";
print $kingaku1, "\n";
print $kingaku2, "\n";
print $kingaku3, "\n";

参考URL:http://tohoho.wakusei.ne.jp/wwwperl1.htm#Binary, http://tohoho.wakusei.ne.jp/wwwperl2.htm#unpack
    • good
    • 0

shinsa14 さん、こんにちわ :-)。



$rec にちゃんとデータが入っているのであれば、

($namae, $kingaku1, $kingaku2, $kingaku3) = $rec =~ m/(.{8})(.{4})(.{4})(.{4})/;

で、一気に全部抽出することが出来ます。

これで抽出できないのであれば、$recの中にデータが入っていないか、
データが上述の形(8,4,4,4)になっていないかのどちらかになります。

制作の参考にしてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ファイルをBinmodeで読み込んででなかったため、レコードが読み込めてなかったようでした。
Binmode を指定したら、教えていただいたやり方で出来ました。
ありがとうございます。

お礼日時:2002/02/01 01:56

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

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

Q$obj->decode($bytes)って何?

Encode.pmのPODを読んでいます。その一文です。


[$obj =] find_encoding(ENCODING)
 Returns the encoding object corresponding to ENCODING. Returns undef if no matching ENCODING is find.

 This object is what actually does the actual (en|de)coding.

 $utf8 = decode($name, $bytes);
 is in fact
  $utf8 = do{
   $obj = find_encoding($name);
   croak qq(encoding "$name" not found) unless ref $obj;
   $obj->decode($bytes)
  };
 with more error checking.


まず
 This object is what actually does the actual (en|de)codeing.

直訳すると、「このオブジェクトは実際のエンコードやデコードを実際に行うものです。」となります。実際の、実際の、と二つ並ぶのはあまり語感が良くないと思いますが、でもこのPODを書いたのは文学者ではないですから、原文の方に問題があるのではないかと思います。

次に「このオブジェクト」とは何を指しているのでしょう。find_encoding関数のことを言っているのでしょうか?

というのは、下に
 $utf8 = decode($name, $bytes);
は実際には、
 $utf8 = do{
  $obj = find_encoding($name);
  croak qq(encoding "$name" not found) unless ref $obj;
  $obj->decode($bytes)
};
だと書いています。{}の中で一番重要なのはfind_encoding関数だと言いたいのではないかと・・・

そうすると
 This object is what actually does the actual (en|de)codeing.
は、
 「実際にエンコードやデコードを行っているのはこの関数です。」
と訳するのが正しいでしょうか?


最後に、
 $obj->decode($bytes)

$objという文字コードで記述されている$bytesという文字列をutf-8に変換したもの、という意味なはず。

でも浅学な私には、どのような文法でこのコードが書かれているか分かりません。

Perlにおいて、変数と言えば$objだったり@objだったり%objだったりします。そしてそのリファレンスはこれら変数の前に「\」を付ければ良くて、リファレンスはスカラー変数となるから、
$refobj=\($|@|%)obj;
となります。

元の変数が(@|%)objの場合、元の変数の一要素を取り出すには、
$obj([index]|{'index'})=$refobj->index;
となります。

これが私の知っている矢印記法の唯一の使い方です。


お手数ですが、どなたか教えていただけないでしょうか?

Encode.pmのPODを読んでいます。その一文です。


[$obj =] find_encoding(ENCODING)
 Returns the encoding object corresponding to ENCODING. Returns undef if no matching ENCODING is find.

 This object is what actually does the actual (en|de)coding.

 $utf8 = decode($name, $bytes);
 is in fact
  $utf8 = do{
   $obj = find_encoding($name);
   croak qq(encoding "$name" not found) unless ref $obj;
   $obj->decode($bytes)
  };
 with more error ch...続きを読む

Aベストアンサー

This object is what actually does the actual (en|de)coding.
のobjectは、その前の文の
Returns the encoding object corresponding to ENCODING. Returns undef if no matching ENCODING is find.
にある
find_encoding(ENCODING) が返す encoding オブジェクトのことです。


> 最後に、
> $obj->decode($bytes)
>
>$objという文字コードで記述されている$bytesという文字列をutf-8に変換したもの、という意味なはず。

ちがいます。
この$obj は $obj = find_encoding($name); で作られた encoding object です。
$objというオブジェクトの decode メソッドを$bytes という引数を
渡して呼び出しています。その結果が $utf8に代入されています。

This object is what actually does the actual (en|de)coding.
のobjectは、その前の文の
Returns the encoding object corresponding to ENCODING. Returns undef if no matching ENCODING is find.
にある
find_encoding(ENCODING) が返す encoding オブジェクトのことです。


> 最後に、
> $obj->decode($bytes)
>
>$objという文字コードで記述されている$bytesという文字列をutf-8に変換したもの、という意味なはず。

ちがいます。
この$obj は $obj = find_encoding($name); で作られた en...続きを読む

Q$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );がよく

$wfurikae = 1 if ( &ccom::getShukujitsu( &com::tD( $wwy,$wwm,$wwd )) ne '' );

というスクリプトがあったのですが、

$wfurikae = 1 の後に;もいれずifがきています。

違和感があります。

どのような意味になるのでしょうか。

宜しくお願い致します。

Aベストアンサー

そのまんまだと思いますよ。
if 以下の条件が真の時 $wfurikae = 1となります。
Perlはいろいろな書き方ができますので、こういう書き方もありです。
英語の文法の並びにする書き方です。

Qperlスクリプト s/^\s+//;  s/\s+$//;  return wantarray ? @out : $out[0]; について

自作の掲示板を作ろうと思い、perlの勉強をしている者です。人様の作ったスクリプトを解析しています。以下のスクリプトはライブラリに記述されていたものです。


sub tttt {
my @out = @_;
for (@out) {
s/^\s+//;
s/\s+$//;
}
return wantarray ? @out : $out[0];


このスクリプトなんですが、 s/^\s+//; の部分の「+」と s/\s+$//; の部分の「+$」、 また「return wantarray~」 の三つの部分のスクリプトが、どういった働きをしているの分かりません。専門書やウェブ上のリファレンスも色々調べたのですが・・。

分かる方いらっしゃいましたらご教授下さると幸いです。よろしくお願いします。

Aベストアンサー

まず前2つの「+」は,正規表現における,「直前の表現を一回以上繰り返し」をあらわします.
「\s」は空白文字一文字を表す正規表現ですので,「\s+」は,「一文字以上の空白文字」になります.
次に,最初の「^」と2番目の「$」は,その正規表現がどこに現れるかを示す記号です.それぞれ,先頭と最後尾にあることを示します.
したがって,「^\s+」は,「最初に空白が一文字以上ある文字列」に,
「\s+$」は「行末に空白が一文字以上ある文字列」にヒットします.
置換構文sはご存知なんですかね.すなわち,この2文で,行の最初と最後の空白を消しているんです.

次に, wantarray ですが,
http://www2u.biglobe.ne.jp/~MAS/perl/ref/wantarray.html
によると,このサブルーチンttttを呼び出すときに,何を返り値にしているかで真偽が決まる関数です.
呼び出す時に配列を希望していたら @out 全体を,変数を希望していたら $out[0]だけを返します.

Qforeach (1..4){ 英文字$_→$新しい変数として使いたい

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = "a$_";
print <<"HTML";
$view<BR>

HTML
}

の時、$viewに$a1~$a5の値を表示させるようにしたいのですが、上記の場合ですとa1~a5として表示されます。

foreachで$_で順に数字をaと組み合わせて出来た文字列を変数として使い、元々指定してある値を取得するようにしたいのです。

どのようにすれば解決できますでしょうか。ご掲示頂けましたら幸いです。

Aベストアンサー

$a1="あああ";
$a2="いいい";
$a3="ううう";
$a4="えええ";
$a5="おおお";
foreach (1..5){
$view = ${"a$_"};
print <<"HTML";
$view<BR>

HTML
}

QPrel正規表現で'$1$'.$saltのあたりが理解できない。

小生Perlを勉強中です。
Perl Codeに以下のようなパスワード暗号処理のサブルーチンが
ありましたが、読めません。教えて下さい。

sub encrypt{
local($inpw)=$_[0];
local(@SALT,$salt,$encrypt);

@SALT=('a'..'z','A'..'Z','0'..'9','.','\');
srand;
$salt=$SALT[int(rand(@SALT)).$SALT[int(rand(@SALT))];
$encrypt=crypt($inpw,$salt)||crypt($inpw,'$1$'.$salt);
return $encrypt;
}

とあります。
特に、下から3行目の($inpw,'$1$'.$salt)が
理解できません。
解説していただければ幸いです。

Aベストアンサー

過去に同様の質問がありました。ctpsysさんの疑問にすべて答えられるかどうかわかりませんが、すくなくとも
>下から3行目の($inpw,'$1$'.$salt)が理解できません
というご質問に対しては参考になるかと思います。

参考URL:http://oshiete1.goo.ne.jp/kotaeru.php3?q=74593,http://oshiete1.goo.ne.jp/kotaeru.php3?q=74593,


このカテゴリの人気Q&Aランキング

おすすめ情報