Perlでバイナリデータの操作(たとえば画像のピクセル部分の変更)をする場合
配列に一つ一つ数値を入れて操作するのと
スカラでデータをいっぺんにパック(?)して操作するのとでは
どちらがいいのでしょうか?

ようはC言語のchar配列の操作のようなことがしたいのですが。

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

A 回答 (1件)

パックって、packのことでしょうか?


まとめた形のまま、たとえばファイルに保存したり、読み出したり
するにはそれが便利だと思いますし、メモリも配列よりは
少なくなると思います。

しかし、配列のように個々の値を変えたりするなら、結局
unpackして配列として扱わなければならなくなりますね。

数値が整数と決まっているのなら、vecを使う手も考えられます。
vec($aaa, 0, 8) = 0xFF;
vec($aaa, 1, 8) = 0x3C;
vec($aaa, 2, 8) = 0xA3;
.....
と代入しておき、あとで$aaaから
vec($aaa, 1, 8) で、オフセット1の場所に入れた0x3Cの値を取り
出す、などということができます。これが一番メモリ効率としては
いいように思います。
詳しくは、perldoc -f vec をご覧ください。
    • good
    • 0

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

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

Qスカラと配列の参照を引数で渡したい。

sub test{
my ($ref) = @_;

print ref $ref;

}
my @a = (1, 2, "A");

#test(\"aaaa"); # SCALER
#test(\['a', 1]); # REF
#test(\@a); # REF # ARRAY
test( \(1, 2) ); # スカラー?


引数を参照で渡すとメモリ効率?が良いと思い、スカラの場合は
\"スカラー"で渡せましたが、 配列の場合は、直接 \('配列', 'です') は無理なのでしょうか?

また、基本的に参照で渡すより、普通の型で渡した方がソースは読みやすいでしょうか?

Aベストアンサー

スカラー変数はもともと参照で渡されます。
@_[n]を書き換えることで呼び側を変更することができます。
配列は、@_にコピーされるために呼び側の値を変更することができません。
その場合は、\@arrayのように参照を渡すことで、呼び側を変更することができます。
大きい配列など参照で渡した方が良い場合があります。
[el1, el2 , …]は無名配列でもともと参照です。\を付ける必要は有りません。
(el1, el2 , …)は、リストであって、配列ではありません。
スカラー的に評価した場合には最後の要素になります。

QPerlのクラス(*.pm)からuseする側の*.cgi内ののスカラやハッシュ、配列の参照は可能でしょうか?

 Perlのクラス(*.pm)からuseする側の*.cgi内ののスカラやハッシュ、配列の参照は可能でしょうか?
いろいろなサーバに対応させやすくするため
1行目(Perlのパス)や各種モジュールのパスや設定情報を*.cgiに書いてプログラム本体は*pmに置きたいのです。
それとももっといい方法がございますでしょうか。
 教えて!ください。

Aベストアンサー

モジュールに渡したい変数をハッシュにしておいて、

モジュールのほうで、

sub new{
my $class = shift;
my %param = @_;
my $self = { param => \%param};

return bless($self,$class);
}

useする側では、

my $hoge = new hoge(%in);

とすると、$hoge->{param}でnewで渡したパラメータが読めます。
これを利用すれば大丈夫ではないでしょうか。

Qperlの配列追加について

perlの配列の扱いについて質問です。
例えば、10個ほどの要素がある配列があるとして新しい要素を配列の任意の場所に追加する方法ってsplice関数を使うのが普通なのでしょうか?
本を参考にsplice関数を使ってみたら任意の場所に上書きのようになってしまいました(単に自分のやり方が悪いだけかもしれませんが)。

perlで簡単に配列の任意の場所へ、上書きではなく追加する方法をどなたか教えてください。
宜しくお願い致します。

Aベストアンサー

ループで配列の中身を読み込みながら別の新しい配列に値を入れ、その途中で、目的の場所になったらそこに入れたいデータを挿入するプログラムを書けばどうでしょうか。
$n=3;#どこに追加するか
$dat="new";#新データ
@arr=(0,1,2,3,4,5,6,7,8,9);#データを追加する配列

my(@new);
--$n;#数字調整
for($a=0;$a<=$#arr;++$a){
if($a==$n){push(@new,$dat);}else{}#新データを入れる
push(@new,$arr[$a]);#配列のデータを入れる。
}
大体こんな感じでしょうか。上三行は設定です。
適当に書いたサンプルなので、少し突っ込みどころとか間違いもあるかもしれません。他にも、while(@arr){}とshift(@arr)を使って、もう少し見た目すっきりにすることはできそうですね。
後アドバイスとして、関数に不満があったり、上手く動かなかったら、自作した方がいいですよ。

Q要らない配列を無くしたい。Perl

要素のない配列を消したいです。

do\n
be\n
usual\n
become\n
get\n
look\n
watch\n

このような複数行の文があり"a"が入っている行だけ配列に突っ込みたいと思っています。

自分が試した方法として。

@line = split(/\n/,$content);

とりあえず改行で区切り配列にぶち込んでいき。

foreach $line (@line){
      unless ($line =~/a/){
      $line = undef;
}
}

その次に"a"が入っている以外の配列にundefを入れるようにしていました。

しかしこれだとundefが入っている配列がたくさん出来てしまい納得がいきません。

要素のない配列を消したいです。

どなたかご教授お願いします。

Aベストアンサー

私なら、結果保存用配列作って該当行をpushします。
@line = split(/\n/,$content);
@result = () ;
foreach $line (@line){
  if ($line =~/a/){
    push @result, $line ;
  }
}

QPerlでの配列のソートについての質問です

Perlでの配列のソートについての質問です。

実行例)
数学,山田,60,佐藤,80,蓑田,55,岸本,90,小笠原,75
英語,山田,70,佐藤,50,蓑田,81,岸本,99,小笠原,80

上のようなcsvファイルを入力として、以下のように各行の中で点数順にソートしてから出力する

数学,岸本,90,佐藤,80,小笠原,75,山田,60,蓑田,55
英語,岸本,99,,蓑田,81,小笠原,80山田,70,佐藤,50

どのようにすればいいでしょうか?ご教授願います。

Aベストアンサー

#No.2です。
さして考えもせず「コレ系は二次元ハッシュ」と答えてしまいましたが、
実際に考えるとただのハッシュでした。
失礼しました。

while( <DATA> ) {
chomp;
my ($subject, %results) = split /,/;
my $result;

foreach ( sort { $results{$b} <=> $results{$a} } keys %results ) {
$result .= "$_,$results{$_},";
}

$result = substr($result, 0, -1);
print "$subject," . "$result\n";

}

__DATA__
数学,山田,60,佐藤,80,蓑田,55,岸本,90,小笠原,75
英語,山田,70,佐藤,50,蓑田,81,岸本,99,小笠原,80


おすすめ情報