トップページ⇒php
1001コメント350KB

Perlコーディング初心者質問スレ Part 41

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/03/10 00:47:16ID:sT66OcmD
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
05525492005/04/18(月) 19:40:25ID:???
ありがとうございました
0553nobodyさん2005/04/18(月) 19:58:14ID:???
>>551
perl -MJcode -e "print $Jcode::VERSION"
のようなワンライナーは普通の人間にも有用だと思うがな。

利用できるモジュールのヴァージョンをコマンドラインで調べるのは
「普通の人間」のする事ではないと言われればそれまでだがな。(w
05545462005/04/18(月) 20:16:51ID:???
getPack();

sub getPack {
my @pack;
my @hex1,@hex2;
my $hex1,$hex2;
open READ, '< C:\hex.txt';
foreach (<READ>) {
chomp;
if (/^#/ || $_ =~ /^\n/ || $_ =~ /^\r/) {
next;
}
push @packet,$_;
}
close READ;
for($i=0;$i < @pack;$i++){
($hex1,$hex2) = split /,/, $pack[$i];
push @{$packed{'hex1'}},pack "C*", packHex($hex1);
push @{$packed{'hex2'}},pack "C*", packHex($hex2);
}
#↓はとりあえず変換できているか確認するために表示させています。
#pack後はバイナリのため直接表示させて確認することができないので
#packされたデータを元のhexデータに変換しています。
#ちゃんと可逆変換ができればきちんと動作しているという確認がとれると考えました。
print"確認 - Hex:".getHex($packed{'hex2'}[0])."\n";
print"確認 - Pack:$packed{'hex2'}[0]\n";
}
05555462005/04/18(月) 20:17:27ID:???
sub packHex {
my $hex = shift;
my @hex;
@hex = split / /, $hex;
@hex = map { "0x".$_ } @hex;
return @hex;

}
sub getHex {
my $data = shift;
my $i;
my $return;
for ($i = 0; $i < length($data); $i++) {
$return .= uc(unpack("H2",substr($data, $i, 1)));
if ($i + 1 < length($data)) {
$return .= " ";
}
}
return $return;
}
sleep(999999);
05565462005/04/18(月) 20:17:53ID:???
txtに書いてあるhexデータは一行ずつ書かれていて
00 00 00 00 FF FF 01 00 02 00 00 00,C8 FB 6A 0A
こんな感じです。

連書き失礼します。
情報を小出しにするつもりはなかったのですがあまり長々と書いてもいけないと
思って簡略に書いてしまいました。
このようなコードを書いたのですがどうしても
push @{$packed{'hex1'}},pack "C*", packHex($hex1);
この時点でうまくpackしてくれません。
私もpackできるものだと思っていただけに原因がわかりません。
重ねてアドバイスお願いできますでしょうか。
0557nobodyさん2005/04/18(月) 21:18:35ID:???
>>554-556
> my @hex1,@hex2;
my(@hex1), @hex2; と解釈されるが、それは意図通りか?

> push @packet, $_;
@pack ではなく?

#!/usr/local/bin/perl -w
use strict;
sub packHex { map pack('H2', $_), map split(/ /), @_ }
sub getHex { join ' ', map uc unpack('H2', $_), @_ }

my(@hex1, @hex2);
while (<DATA>) {
  next if /^[\n\r#]/;
  chomp;
  my($hex1, $hex2) = split /,/;
  push @hex1, packHex($hex1);
  push @hex2, packHex($hex2);
}

print getHex(@hex1), "\n";
print getHex(@hex2), "\n";

__DATA__
00 00 00 00 FF FF 01 00 02 00 00 00,C8 FB 6A 0A
05585462005/04/18(月) 22:33:33ID:???
>>557
レスありがとうございます。
ご指摘のとおり2箇所間違っていました。
更にはアドバイスどころかこんなコンパクトなコードまで
書いていただいいてありがとうございます。

あともうひとつだけできないことがありまして
print getHex(@hex1), "\n";
をした場合に"C8 FB 6A 0A"このように表示されるようにしたいのですが
(つまりバイナリデータを配列の1要素として格納したい)

557さんのコードを元に
$i=0;
while (<DATA>) {
next if /^[\n\r#]/;
chomp;
my($hex1, $hex2) = split /,/;
$hex1[$i] = packHex($hex1);
$hex2[$i] = packHex($hex2);
$i++;
}
close DATA;
#ためしに一行目のデータだけを表示
print getHex($hex1[0]), "\n";
print getHex($hex2[0]), "\n";
このようにしてみましたがうまくいきません・・・
0559nobodyさん2005/04/18(月) 22:39:16ID:???
>>556
とりあえず文字列"0x10"は数値として解釈されると0x10(=16)では
なくて0になるってことに気をつけるべきだな。
0560nobodyさん2005/04/19(火) 00:10:27ID:???
>>558
>>1
> 3: こんなエラーが出て上手く行かなかった。

http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_join_EXPR_LIST
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_map_BLOCK_LIST
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_pack_TEMPLATE_LIST
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_push_ARRAY_LIST
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_split__PATTERN__EXPR_LIMIT
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod#item_unpack_TEMPLATE_EXPR
http://perldoc.jp/docs/perl/5.8.1/strict.pod

sub packHex { join '', map pack('H2', $_), split / /, pop }
sub getHex { join ' ', map uc unpack('H2', $_), split //, pop }

sub packHex { my @chr = split / /, pop; pack 'H2' x @chr, @chr }
sub packHex { local $_ = pop; s/\s+//g; pack 'H*', $_ }
05615462005/04/19(火) 11:21:09ID:???
>>560
たびたびありがとうございます。
すいませんでした。
テンプレの基本がなってませんでした。
各関数の詳細解説までつけていただいてありがとうございます。
perldocというのがあるのですね。
これは凄くありがたいです。
packHexにもいろいろなやり方があっておもしろいです。
これから少しずつ噛み砕いて見ていこうとおもいます。
かなりお世話していただいて本当にありがとうございました。
0562質2005/04/19(火) 12:56:26ID:xzzJhUPg
「EUC-JP」で保存したログファイルを持つ掲示板に書き込むと自動的に「SHIFT-JIS」で保存されてしまいます。
「ECU-JP」で保存されるようにするにはどのようにすればよいのでしょうか?
0563nobodyさん2005/04/19(火) 13:31:28ID:???
>>562
jcode.plとかで文字コードをEUC-JPに変換して保存する。
0564質2005/04/19(火) 14:33:26ID:xzzJhUPg
>>563
お答えありがとうございます。
ところがjcode.plをEUC-JPで保存出来ないんです。
他のファイルは出来るのですけど。。。
0565nobodyさん2005/04/19(火) 14:51:11ID:???
>>564
jcode.plを使って保存する文字列のコードをEUC-JPに変換する。
&jcode::convert(\$hoge,"euc-jp","sjis");

貴方の文脈では、jcode.pl自体をEUC-JPで保存しようとしてるぞ。
本当にそうだったりしてw
0566nobodyさん2005/04/19(火) 15:30:24ID:???
perlでテキストファイルの特定の部分を拾い出し、それを配列の中にぶち込みたいと思います。
--start_of_aaa--
あああ  ←
いいい  ←この部分を@aaaに
ううう  ←
--end_of_aaa--
--start_of_bbb--
かかか  ←
ききき  ←この部分を@bbbに
くくく  ←
--end_of_bbb--
--start_of_ccc--
さささ  ←
ししし  ←この部分を@cccに
すすす  ←
--end_of_ccc--

open (TMPL,'./tmpl.dat');
@templates = <TMPL>;
close TMPL;
foreach $line (<@templates>){
 if($line =~ m|--start_of_aaa--|){
  unless($line =~ m|--end_of_aaa|){
   push @aaa,$line;
  }else{
   last;
  }
 }
 if(以後同様の繰り返し)
}
当然@aaaには--start_of_aaa--しか入らないのですが、ここで詰まってしまい、先に進めません。。。
0567nobodyさん2005/04/19(火) 16:02:20ID:???
>>566
漏れならこうするかなあ。

my %data = ();
my $key = "__GOMI__";

foreach my $line (<@templates>) {
if ($line =~ m/--(start|end)_of_(\w+)--/) {
$key = ($1 eq "start") ? $2 : "__GOMI__";
$data{$key} = [];
} else {
push(@{$data{$key}}, $line);
}
}

my @aaa = @{$data{"aaa"}};
my @bbb = @{$data{"bbb"}};
my @ccc = @{$data{"ccc"}};
0568nobodyさん2005/04/19(火) 16:19:21ID:n4Wb5OBG
お尋ねしたいのですが、
メールフォームのデータをCSVに保存するCGIの改造です。
吐き出されたデータが"xxxx"という風にダブルコーテーションで囲まれてしまいます。
これを外して登録したいのですが、ご教授お願いします。

$head = "DATE";
$head.= join("\",\"", 'DATE', @KEY);
$out_data = join("\",\"", @output);

if (-f $f2m_file){
open(OUT, ">> $f2m_file") or &openerr();
flock(OUT, 2);
seek(OUT, 0, 2);
}
else{
open(OUT, "> $f2m_file") or &openerr();
flock(OUT, 2);
seek(OUT, 0, 0);

print OUT jcode("\"$head\"")->sjis."\r\n";
}
print OUT jcode("\"$out_data\"")->sjis."\r\n";
close(OUT);
chmod(0644, $f2m_file);
}
0569質2005/04/19(火) 16:37:39ID:xzzJhUPg
>>565
いやあ、お恥ずかしい、その通りでしたw
ソースを書き換えて出来るようになりました。ありがとうございます。
05705662005/04/19(火) 17:19:41ID:???
>>567
ありがとー!!
できました。
0571nobodyさん2005/04/20(水) 00:36:08ID:PF1TJn1K
わからないので質問させてください。
CGIなどによく「***.cgi?mode=find」みたいな感じでリンクになっていたりしますがmode=findの部分はどういう仕組みになっているのでしょうか?
0572nobodyさん2005/04/20(水) 00:37:53ID:???
>>571
はい、Perlに関係ないです。
しかもコーディングスレです。
0573nobodyさん2005/04/20(水) 05:06:40ID:2zJFmw5b
       見込 売上確定
3/31 新井  50000
4/1  伊藤 10000
4/10  新井 -50000 50000
4/10  上田 20000
4/15  新井 30000
4/17  伊藤 -10000 10000
4/17  伊藤 40000

こんな感じのテキストデータがあって、
スタッフごと・月ごとに売上確定分や売上見込の集計を出したいんだが…
スタッフは単発もいるので、あくまでこのデータだけから抽出したいけど、
どうすればいいんだろうか。if文使いまくりになりそうで。
0574nobodyさん2005/04/20(水) 05:34:11ID:???
>>573
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perllol.html
0575nobodyさん2005/04/20(水) 09:22:01ID:???
>>573
タブ区切りの場合:
while(<>){
if(/^(\d+)/){$tuki=$1;}
if(defined $sengetu and $sengetu != $tuki) {
print "$sengetu月\n";
foreach $key (keys %mikomi) {
print "$key: 見込=$mikomi{$key} 売上確定=$uriage{$key}\n";
}
undef %mikomi; undef %uriage;
}
if (/^\d/) {
split(/\t/,$_);
$mikomi{$_[1]} += $_[2];
$uriage{$_[1]} += $_[3];
$sengetu=$tuki;
}
}
print "$sengetu月\n";
foreach $key (keys %mikomi) {
print "$key: 見込=$mikomi{$key} 売上確定=$uriage{$key}\n";
}
0576nobodyさん2005/04/20(水) 09:24:41ID:???
過疎地だから、飛び入りにはやさしいスレです。
05775732005/04/20(水) 09:47:22ID:???
うおお!もうレスが!>>574>>575ありがとう。
昨日一人で考え込んで明け方になっちゃったんだけど、
まさか起きたらもうレスがついてるとは思わなかったよ。

>>576の言うとおりだね。厚意をありがたく思います。
つか、>>575をコピペでいけちゃいそうだぞw 申し訳ないっす。
0578nobodyさん2005/04/20(水) 18:30:18ID:???
>>577
>>575だけどさ、まあいいってことよ。
その代わり、Perlを宣伝しろよな。
Perlに利害関係があるわけじゃないけどさ、このごろrubyが
幅利かせすぎだよね。

0579nobodyさん2005/04/20(水) 18:33:21ID:???
>>576
>過疎地だから、飛び入りにはやさしいスレです。
1年前or半年前くらいは、すっごいレスの伸び様だったがな。
何かさ、やっぱrubyに食われてる?それともphpか。
0580nobodyさん2005/04/20(水) 20:02:41ID:???
>>579
rubyやpythonに行くぐらいならjavaがいいや。

phpはApacheとの連携が強力なのでいっそJakarta Projectに
加わってApacheの標準Scriptの地位を固めてくれんかな。
0581nobodyさん2005/04/20(水) 21:49:51ID:???
>>575を弄ってみた

while(<DATA>){
split/\t/;
$_[0]=~s/\/\d+$//;
$hash{$_[0]}{$_[1]}{miko} += $_[2];
$hash{$_[0]}{$_[1]}{kaku} += $_[3];
}
foreach my $tuki(sort{$a<=>$b} keys %hash){
print "$tuki月\n";
foreach my $name(sort keys %{$hash{$tuki}}){
print "$name:\t見込=$hash{$tuki}{$name}{miko}\t売上確定=$hash{$tuki}{$name}{kaku}\n";
}
}
0582nobodyさん2005/04/20(水) 22:12:44ID:???
おお…
0583nobodyさん2005/04/21(木) 03:11:08ID:???
通常CGIに引数を渡して呼び出す場合、
a.cgi?k=1のようにアドレスバーに引数を含むアドレスが表示されますよね
CGIゲームなどをやっているとこの引数が表示されない場合があるのですが
そういう風に引数を見えなくするにはどうしたらいいのでしょうか
0584nobodyさん2005/04/21(木) 03:31:43ID:???
method="post"
CGIスレとかWeb制作板で聞いてね
0585nobodyさん2005/04/21(木) 09:48:59ID:u958lKZ/
perlスクリプト内でPAHT,LD_LIBRALY_PATHを設定することは出来ますか?
スクリプトを手動で実行すると動くのですが、cronから実行すると
ライブラリが見つからないと怒られてしまい困ってます。
0586nobodyさん2005/04/21(木) 10:05:27ID:???
自プロセスの環境変数を設定するだけだったら、問題なく可能
0587nobodyさん2005/04/21(木) 11:02:48ID:???
掲示板系のCGIでmy変数などって使ったほうがいいのでしょうか。
全部グローバル変数でやってまして最近my変数を覚えたんですけど、
KENTの掲示板などを落として見てみてもmy変数使って無いですし、
そんなに長い処理でもないと思うので、そこまで気を遣う必要ってないのでしょうか。
自作しているのは、サブルーチンの階層も深くて2つまでです。
0588nobodyさん2005/04/21(木) 16:44:18ID:???
KENTを参考にしている時点でぬるぽだな
0589nobodyさん2005/04/21(木) 17:07:45ID:???
>>584
ありがとうございます
0590nobodyさん2005/04/21(木) 17:56:10ID:???
サブルーチンの階層って何だw
myは便利だよ。 もう my のない世界なんて考えられないって程に。
0591nobodyさん2005/04/21(木) 18:24:00ID:???
俺が勉強したての時に参照したCGIは、モジュール化に物凄い気を遣ってて見やすかった。

直せるうちに直しておいた方が、後で改造するときに分かりやすいと思う。
変数名なんて三日も空けば忘れるからな。
ちょっと手間をかけておく事で、後の面倒を大きく減らせる。

他のプログラム言語なんかも学ぶなら、my変数のような考え方は必須になる。
グローバル関数を無くし関数の独立性を高めるという考えは、カプセル化、そしてオブジェクト指向に繋がっていく。
0592nobodyさん2005/04/21(木) 18:43:42ID:???
my っていうか ruby -w と use strict は使うクセを付けておいた方が良いと思う。
0593nobodyさん2005/04/21(木) 20:42:56ID:???
>ruby -w
詳しく。
0594nobodyさん2005/04/21(木) 22:24:07ID:???
ごめん perl -w だた。
0595nobodyさん2005/04/21(木) 22:54:38ID:???
今はuse warnings;で代用できるよん。便利です。
0596nobodyさん2005/04/22(金) 07:08:46ID:0S2C2eid
lzh扱えるモジュールないっすか?
0597nobodyさん2005/04/22(金) 07:26:56ID:???
>>596
Perlモジュールについて
http://pc8.2ch.net/test/read.cgi/php/997829243/

Win なら
http://homepage3.nifty.com/hippo2000/perltips/perllha.htm
やりたい事によっては system() で lha(1) を使った方が早いかも。
0598nobodyさん2005/04/22(金) 07:41:56ID:???
thx
そこでで聞いてみるっす
0599nobodyさん2005/04/22(金) 16:04:20ID:???
¥nと¥の違いがわかりません
ググっても出ないorz
0600nobodyさん2005/04/22(金) 16:07:04ID:???
ぐああ
すんません
わかりました
0601nobodyさん2005/04/22(金) 16:42:34ID:???
ワロス
0602nobodyさん2005/04/22(金) 18:59:27ID:???
$a01+$a02+$a03+$a04+$a05+$a06+$a07+$a08

これをもうちょっとこざっぱりとまとめて書きたいんですが…
どうしたらいいでしょうか?
0603nobodyさん2005/04/22(金) 19:09:20ID:???
配列を使え
0604nobodyさん2005/04/22(金) 23:09:20ID:???
$aa=~s/$hensu1/$hensu2/g;

この例で、$hensu1 にどのような文字列が来るか分からない時は、
必ず、
$aa=~s/\Q$hensu1/$hensu2/g;
とすべきなのでしょうか?

また、例えば、
  $aa="ポっポっポ、はとポっポ";
  $aa=~s/ポ/ぽ/g;
  print $aa;
これでは、文字が化け化けで、
  $aa="ポっポっポ、はとポっポ";
  $aa=~s/\Qポ/ぽ/g;
  print $aa;
とすれば正常になりますが、「ポ」と同じように\Qでクォートしなければ
いけない文字は、他に何がありますか?というか、どのような理屈で
クォートしなければいけないのでしょうか?
0605nobodyさん2005/04/22(金) 23:12:33ID:???
2バイト文字が泣き別れしてるから。
use encodingしる。>>518,>>530
0606nobodyさん2005/04/22(金) 23:15:23ID:???
変数名を動的に(?)作ることできますか。
perl -e '$a0=1; $a1=2; $a2=3; for(0..9){print "$a$_\n";}'
みたいなんで$a0から$anまでの変数を作りたいんですが、これじゃ
変数名としてつながってくれないんです。
0607nobodyさん2005/04/22(金) 23:39:50ID:???
% perl -e '$a0=1; $a1=2; $a2=3; for(0..9){print "${'a'.$_}\n";}'

詳しくは「シンボリックリファレンス」をキーワードに調べてくれ。

しかし一応できるこたできるが、よっぽど特殊なことをやろうと
言うんじゃない限りはじめから配列かハッシュ使ったほうがいいと
思われ。
0608nobodyさん2005/04/23(土) 04:13:32ID:???
>>607
ありがとうございました。なるほど{}ってシンボリック
リファレンス作るにも使うんですね。メモメモっと。
0609nobodyさん2005/04/23(土) 12:37:33ID:???
シンボリックリファレンスの概念をあっさり理解できるのに、配列は使えないのか?
それとも、配列を使えない事情があるのか?
>607のコードが使える状況で配列が使えない状況ってのが思いつかんのだが…
0610nobodyさん2005/04/23(土) 13:52:44ID:???
マシン語→C→Perlと歩んできたに違いない。
リファレンスは意外と馴染みやすい。
0611nobodyさん2005/04/23(土) 17:56:38ID:???
なんつーかeval使った方が・・
0612606=6082005/04/23(土) 18:16:56ID:???
>>609
ごみんなさい、わては>>602じゃないです。
もち>>602の場合は、配列でしょうが、
コマンドラインでワイルドカードを引数において、たくさんのファイルを
読んでそのファイル名に応じた変数を作りたかったのです。
便乗質問の積もりですた。
0613606=6082005/04/23(土) 18:18:40ID:???
>>602はどこに消えた〜い。
0614nobodyさん2005/04/23(土) 18:34:26ID:???
>>612
わるいことはいわないのでファイル名をキーにした
ハッシュにしとけ
0615nobodyさん2005/04/23(土) 21:08:01ID:???
すみません、質問させてください。

登録されたデータ(ログファイル)から任意の3つくらいを抽出したいのですが、
このとき重複しないような方法がわかりません。

具体的にいうと、タグを何個か1つのログに登録しておいてそのなかの3つくらいを重複しないようにランダムに出したいのです。

randでやったらどうしても重複してしまいます。
0616nobodyさん2005/04/23(土) 21:32:20ID:???
>>615
以前に抽出したもの(index番号等)を覚えておいて、新しいものを選ぶ度に重複していないかチェック。
0617nobodyさん2005/04/23(土) 21:44:19ID:???
>>615
んじゃ、>>616さんと違う手法で、
ランダムに並べ替えてから、任意の3つを取る。

@tag = ('big','small','strong','table','input','img');
for(@tag){
$hoge = rand(@tag);
($tag[$_],$tag[$hoge]) = ($tag[$hoge],$tag[$_]);
}
for(0..2){
print "$tag[$_]\n";
}
0618nobodyさん2005/04/23(土) 22:55:20ID:???
>>616-617
とても参考になりました。ありがとうございます、やってみます。
0619nobodyさん2005/04/23(土) 23:55:32ID:???
my %aaa = (  'a' => '0',  'b' => '1',  'c' => '2', );
my @bbb = (
 ['ab','ac','ad',],  # 0
 ['be','bf',],     # 1
 ['cg',],      # 2
);         # このようなデータを用意しておき、
my $data = "abc";   # というデータを与えた時に

my @list = (  'abbecg',  'abbfcg',  'acbecg',  'acbfcg',  'adbecg',  'adbfcg', );
# @listのような配列を作り出したいのですがどなたか教えて下さい。

# (1) %aaaのa,b,cの部分は英数字と記号が入ります。
#     %aaaの0,1,2はそれぞれ順番に数字を割り当てています。
# (2) @bbbの一次元目の数値は%aaaの0,1,2と一致します。
#     @bbbの二次元目の要素数は固定ではなく変化します。
# (3) $dataは%aaaに該当するものがあった場合にのみ「a→ab」のように変化し、
#     %aaaに該当するものが無い場合は「z→z」のように変化しません。

# 現在は以下のようにしてランダムに出力しているのですが、
# 今やりたいことは出力される可能性のある文字列全てを取り出したいのです。
# 分かりにくくてすいませんが宜しくお願い致します。
> my $compdata = "";
> for(split//,$data){
>  if ( $#{$bbb[$aaa{$_}]} || $bbb[ $aaa{$_} ][0] ne "" ){
>   $compdata .= $bbb[ $aaa{$_} ][ rand $#{$bbb[$aaa{$_}]} ];
>  }else{
>   $compdata .= $_;
>  }
> }
0620nobodyさん2005/04/24(日) 01:27:40ID:???
こういうことかな。もっとかっこいいのが出てくると思います。

my @list;
for (split //,$data){
my $comp;
if(defined $aaa{$_}){
$comp=$bbb[0]->[$aaa{$_}];
}else{
$comp=$_;
}
for (@{$bbb[1]}){
my $temp=$comp;
$comp.=$_;
for(@{$bbb[2]}){
my $temp=$comp;
$comp.=$_;
push @list, $comp;
$comp=$temp;
}
$comp=$temp;
}
$comp="";
}
for(@list){
print $_,"\n";
}
0621nobodyさん2005/04/24(日) 01:31:30ID:???
>>619
#!/usr/local/bin/perl
use strict;
my %order = (a => 0, b => 1, c => 2, d => 3);
my @data = (
  [ 'ab', 'ac', 'ad' ],
  [ 'be', 'bf' ],
  [ 'cg' ],
  [ 'dh', 'di' ],
);

my @result;
my_push(\@result, [ @data[@order{ split //, $ARGV[0] }] ]);
print join "\n", @result;

sub my_push {
  my($result, $data, $i, $pre) = @_;
  if ($i == $#{$data}) {
    push @{$result}, map "$pre$_", @{$data->[$i]};
  }
  else {
    my_push($result, $data, $i + 1, "$pre$_") for @{$data->[$i]};
  }
}
06226192005/04/24(日) 02:01:01ID:???
>>620さん
ありがとうございます。
言葉が足りずに申し訳ございません。目的のものとは違ったようです。
$dataの文字数は毎回異なります。

>>621さん
ありがとうございます。
分かりにくい表現で申し訳ございません。
入力される文字列は設定済みの文字列だけではなく、
> %order = (a => 0, b => 1, c => 2, d => 3);
ではa,b,c,dが設定済みですが、e,f,g...x,y,zのような、
未定義の値が入力されることもあり、その場合は変化しないように出来ると嬉しいです。

とはいえ、後は何とかなりそうなの気がするので頑張ってみます。
お二方、本当にありがとうございました。

書き込みしてからも色々と調べていたのですが、
my %CCC = (
  'a' => ['ab','ac','ad',],
  'b' => ['be','bf',],
  'c' => ['cg',],
);
こんな書き方も出来るのですね。

本当にありがとうございました。
引き続き頑張ってみます。
また、分からないことがあったら宜しくお願い致します。
0623nobodyさん2005/04/24(日) 02:16:56ID:???
ずこー
0624nobodyさん2005/04/25(月) 08:46:28ID:???
$var =~ m/nantoka/; = $var =~ /nantoka/;
$var =~ m/nantoka/igo; = $var =~ /nantoka/igo;
mって使う必要ないと思うんだけど、みなさん、いつ使ってます?


0625nobodyさん2005/04/25(月) 11:04:05ID:???
>>624
'/' を正規表現に含める時。

/^([^\/]*)\/([^\/]+)\/(.*)\z/;
/^ ([^\/]*) \/ ([^\/]+) \/ (.*) \z/x;
m|^([^/]*)/([^/]+)/(.*)\z|;
m|^ ([^/]*) / ([^/]+) / (.*) \z|x;
0626nobodyさん2005/04/25(月) 15:14:52ID:???
>>624
謝りたい気分の時。

$str =~ m(_ _)m;
0627nobodyさん2005/04/25(月) 16:13:33ID:???
( ´∀`)ワラタ
0628nobodyさん2005/04/25(月) 20:42:14ID:???
>>625-626
レスありがとうございます。
なるほど、/のエスケープを省略したいときですね。
誤りたいとき使うとまた誤らなきゃですね(w
どもども。
0629nobodyさん2005/04/26(火) 12:58:40ID:???
JAPUたん降臨希望age
0630nobodyさん2005/04/26(火) 14:53:35ID:???
ちょっと上でも出てた話題にかぶるかもしれないんですが・・・
@list($h01,$h02,$h03)
$h01〜03に、例えばそれぞれ0,0,1と代入されている時
@listの中のどの変数に1と入っているかを確認するには?indexを使うんでしょうか?

if (@list==1) {・・・(以下続く)
これは間違ってる書き方ですがorz、
こんな風に『@listの中の変数のどれかが1であれば・・・』と
条件文の中に組込みたいのです。
0631nobodyさん2005/04/26(火) 14:53:56ID:OvccyAYT
あげさせて下さい
0632nobodyさん2005/04/26(火) 15:00:58ID:???
>>630
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o
0633nobodyさん2005/04/26(火) 17:41:53ID:???
>632
ありがとう!やってみます。
0634nobodyさん2005/04/26(火) 18:10:21ID:6+zG2+f5
何度もすみません・・・もう1ついいでしょうか。
$aaaが一定以上の値になった時、変動する$aaaをその値以上に固定する
というのはどう書けばいいでしょう?
if ($aaa >= 10) { $aaa != 10 ;}
何か違う・・・orz
0635nobodyさん2005/04/26(火) 18:41:56ID:???
!消せばいいだけでは。
0636nobodyさん2005/04/26(火) 18:49:53ID:???
>635
すみません、説明が悪かったです・・・
$aaaは10以下にはならず、10以上の値には変動できる、という書き方です。
!を消すと$aaaは10、になってしまうので。。
0637nobodyさん2005/04/26(火) 20:13:05ID:???
>>636
10以下ならもう一度変動させれば?

あと「以下」と「以上」の使い方がおかしい。
10はどっちにも含まれるぞ?
0638nobodyさん2005/04/26(火) 20:34:12ID:???
$aaaがどう動く、どういう性質の変数なのか分からんと、どう変えていいものか迷う。
乱数なのか、ユーザの入力値なのか、1ずつ減るカウンタ用の変数なのか、二次関数みたいな関数の値なのか。
$aaaに10を代入するのは何故いけないの?
$aaaに10を加算するだけでは駄目?
0639nobodyさん2005/04/26(火) 20:37:06ID:6+zG2+f5
>637
ほ、ほんとだすみません、10未満にはならず、10以上の値には変動できる、です。

>もう一度変動させれば?
言われて気付いたんですが・・・、ここで出た結果のみで判断させたいんですorz

if ($aaa >= 10) { !($aaa <= 10) }
これだと10以上ではない、と言うだけですよねアー
06406342005/04/26(火) 20:47:57ID:???
>638
ええと、説明下手なんですが・・・
>ユーザーの入力値
はい、そんな感じです。
$aaaは値が1ずつ加算されて、上限(例えば100)で止まる、といった動きをします。
ゲームなどで得点が1ずつ増えていくような・・・
なので、代入や一気に加算する、といった性質の変数ではないです。
0641nobodyさん2005/04/26(火) 22:12:18ID:???
>>640
その処理をするには、3つの値(変数)が必要なんですよ。
1. 変動する値 (1ずつ加算される値)
2. 上限値 (100)
3. 保持する値 (上限値に達するまでは1と一致して、それ以降は2と一致)
文章で書くと$aaaと表現するので分かり辛いかも知れないですけど、
1.を比較等の色々の処理をした結果が3.になるわけで、これを1つの変数$aaaで表す事はできません。
06426342005/04/26(火) 22:41:02ID:Bt64jE3X
>641
詳説、ありがとうございます。目から鱗です。orz

変動する値の$aaaと、上限値$bbb、保持する為の変数が$ccc

$bbb=100;
#ここで$aaaを1ずつ足していく
#で、もし$aaaが10に達したら・・・
if ($aaa >= 10) {

・・・・この先がわかりません・・・
0643nobodyさん2005/04/27(水) 00:40:25ID:???
>>634と>>641が何を話してるのかさっぱりわからんのは俺だけか…?
0644nobodyさん2005/04/27(水) 02:06:54ID:???
>>642
if($aaa<10){
$aaa++;
}
0645nobodyさん2005/04/27(水) 02:34:26ID:???
>>642
$aaaが$bbbに満たっていない間、$cccに$aaaを代入すればいいだけだろ。
06466382005/04/27(水) 02:39:01ID:???
>639
比較と代入の理解が滅茶苦茶だな。
<=とか==とか<は比較をするだけで、値を変化させるわけじゃないぞ。

if($aaa > $bbb) $ccc = $bbb;
else $ccc = $aaa;
お前が本当にやりたい処理は
「$aaaが上限値($bbb)より大きいときは、$aaaを上限値にする」じゃないか?
ちょっと落ち着いて、場合分けして考えてみるといい。

個人的には
if($aaa > $bbb) $aaa = $bbb;
でじゅうぶんな予感もする。
上限値に切り揃える前の点数のデータが不要ならば、の話だけど。
06476382005/04/27(水) 02:40:06ID:???
>646
>「$aaaが上限値($bbb)より大きいときは、$aaaを上限値にする」
ちょっと誤解を招く表記だな。
「$aaaが上限値($bbb)より大きいときは、$aaaを上限値と等しい値にする」
に訂正。
0648nobodyさん2005/04/27(水) 02:49:37ID:???
1づつ足していけばこう変動するしかなかろう。
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20...

これをどう変動させたいのだ?
0649nobodyさん2005/04/27(水) 09:44:59ID:???
プログラムの一箇所で「この変数の値は絶対を超えません」と宣言すれば
他のところで何やっても10までしか上がらない
ということを希望してるのか?

それだったら、$aaa 専用のクラスを一つ作って、専用の add() メソッドを実装しろ
$aaa 専用に += や ++ 演算子をオーバーロードするのも吉
0650nobodyさん2005/04/27(水) 11:36:43ID:???
こんな質問しちゃうやつがクラスやメソッドが理解できると思ってるの?
06516342005/04/27(水) 12:41:57ID:???
何度もすみません・・・
>比較と代入の理解が滅茶苦茶
はい、値を変化させるものではないのはわかっているんですが、表現が思いつかず・・・

>プログラムの一箇所で「この変数の値は絶対を超えません」と宣言すれば
>他のところで何やっても10までしか上がらない
はい、そんな感じです。
ただ、10までしか上がらないのではなく、10より下には下がらない、というのを希望しています。

add() メソッドは、調べてみたのですがちょっと難しくてわかりませんでした。
折角紹介してくださったのにすみません。
06526342005/04/27(水) 12:42:18ID:???
こちらの知識不足と情報を小出しにしてしまったせいで、
余計何したいのかがわかりにくくなってしまいましたよね・・・・orz

下限0から始まって上限100で止まる
0から始まって、ユーザーの入力にあわせて1ずつ加算・減算されていく
(加算と減算は別のところで処理させるつもりでした)
0 1 2 3 4 5 6 7 8 9 10
10まで達したら、
11 12 13 14 15 16 17 18 19 20...
引き続き加算と減算が行われるが、一旦10以上になったら、
それ以降は減算されても値は10未満にはならず、10〜100の間で上下する

こんな動作をさせたいと思っていました・・・
■ このスレッドは過去ログ倉庫に格納されています