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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0482nobodyさん2005/04/10(日) 00:14:51ID:???
エラーだけどね
0483nobodyさん2005/04/10(日) 00:30:04ID:???
きっとサブルーチンの中に書かれてるんだ。
0484nobodyさん2005/04/10(日) 01:41:29ID:???
>>482-483
$ cat omaera_aho.pl
print 'すべての素数'

$ perl omaera_aho.pl
すべての素数
0485nobodyさん2005/04/10(日) 02:41:51ID:???
STDINを何度か読み直ししたいときってどうしてる?
二回 read したいんだけど、seek(STDIN, 0, 0) しても先頭に戻らなかった・・・。
一回グローバルな変数に置いておくとか、ファイルに書き出すとかしかないんかな?
うーむ。
0486nobodyさん2005/04/10(日) 03:20:01ID:???
STDINはFIFOなバッファ。こぼれた水は元に戻らない。
0487nobodyさん2005/04/10(日) 10:33:46ID:???
マルチコアとか64bitのCPU使ったらperlのスクリプトは
速くなりますか?あるいは速くする書き方はありますか?
0488nobodyさん2005/04/10(日) 16:56:27ID:???
>>487
http://www.oreilly.co.jp/books/4873110971/toc.html
24章を読め。
0489nobodyさん2005/04/10(日) 17:58:57ID:???
$selという文字列をselected="selected"に置換したいのですが
 ~s/\$se/ selected="selected"/i;
だとうまく行きません。どうすればいいでしょうか。
0490nobodyさん2005/04/10(日) 19:16:45ID:???
$buf = '$sel';
$buf =~ s/\$sel/selected="selected"/i;
print $buf;

ふつーに出来たけど
0491nobodyさん2005/04/10(日) 19:54:56ID:???
~s/\$se/ selected="selected"/i;
    ↑
0492nobodyさん2005/04/10(日) 20:04:56ID:???
多分 g オプション。
0493nobodyさん2005/04/11(月) 08:27:59ID:???
~s/\$se/ selected="selected"/i;
↑

この頭の~は何のためにつけてるのだろうか?
0494nobodyさん2005/04/11(月) 08:33:02ID:???
>>493
結果の補数を取る為ですが、おかしいですか…?
0495nobodyさん2005/04/11(月) 13:30:35ID:???
双子素数が無限に存在することを証明するスクリプトが書けた
0496nobodyさん2005/04/11(月) 15:06:37ID:???
65536ビットの数値を1ミリ秒で素因数分解するスクリプトがかけた夢を見た。
0497nobodyさん2005/04/11(月) 17:22:12ID:???
↓ 夢が現実になる瞬間!!
0498nobodyさん2005/04/11(月) 18:48:58ID:???
(´・ω・`)
0499nobodyさん2005/04/12(火) 03:03:59ID:qneeBtxS
文字列の中に含まれる<br>の 個数 を取得する簡単な方法ってないですか?
例えば↓なら結果として 3 が欲しいのです。
$str = 'a<br>bb<br>cccccc<br>dd';

現在は、配列を経由させてなんとか取得しています。
$str = 'a<br>bb<br>cccccc<br>dd';
$result = @dummy = $str =~ m/<br>/g;
print $result;
0500nobodyさん2005/04/12(火) 03:25:15ID:???
>>499
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_count_the_number_of_oc

$result++ while $str =~ /<br>/g;
$result++ while ($pos = index $str, '<br>', $pos)++ > -1;
$result = @{[ $str =~ /<br>/g ]};
$result = $#{[ split /<br>/, $str ]};
05014992005/04/12(火) 09:03:28ID:???
いろいろあるんですね。
1行目の方法でいきたいと思います。
ありがとうございました。
0502nobodyさん2005/04/12(火) 22:17:46ID:jd+szO9r
if(    )
   ↑の部分に直接サブルーチンを書いて判定させたいのですが、どのようにすればいいですか?
if (&{foreach (keys(%{$CONFIG{'add'}})) { return 1 if $data[$_][0] == $_; } return 0;})
こんな風に書いてみたのですが、returnで返したのが不味かったらしく、エラーが出てしまいました。
どのように書けば良いのか知っている方ご教授して頂けると嬉しいです。
0503nobodyさん2005/04/12(火) 22:56:01ID:???
>>502
エラーが出たならエラーメッセージを読めばいいじゃない。
「Can't return *outside* a subroutine」と答は出てるだろ?
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html
05045012005/04/13(水) 00:36:56ID:???
>>503
すみません。evalで出来ました。ありがとうございました。
0505nobodyさん2005/04/13(水) 16:47:52ID:3dbRXjnX
質問です。
PerlにはJavaのようなboolean型のような変数宣言はできないのでしょうか。
数値以外は文字列として扱う必要があるのでしょうか。

$isErr = false;
if ($isError) {
 print "Error";
} else {
 print "Not Error";
}

こう書くと実行はできるのですが、-cwで文字列をどうにかしろとのエラーが出てしまいます。
0506nobodyさん2005/04/13(水) 16:49:26ID:???
変数名が間違えてました、全て$isErrか$isErrorで統一するという条件でです。
修正しても、結果は変わらないのですが・・・
0507nobodyさん2005/04/13(水) 17:04:28ID:???
sub true () {!0}
sub false () {0}

print("True\n") if true;
print("False\n") unless false;
0508nobodyさん2005/04/13(水) 21:30:45ID:mF6hKb8m
No.000001 あいうえお No.000002 かきくけこ No.000003 さしすせそ No.000004 たちつてと
これを

No.000001 あいうえお
No.000002 かきくけこ
No.000003 さしすせそ
No.000004 たちつてと

みたいにやるのってどうやるの?

単純に No.[000000-999999] の前に改行入れたらマ白になたヨ
0509nobodyさん2005/04/13(水) 21:38:08ID:???
No. の前にでも入れればぁ?
0510nobodyさん2005/04/14(木) 03:04:17ID:???
>>505
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html

Perl では undef か空文字列か 0 が偽、その他は真。false と
いう名の演算子もリテラルも存在しないので、サブルーチン
false を定義していない限り $isErr = false; の false は
bare word (裸の単語) と解釈され、$isErr = 'false'; と同義。
-w オプションは bare word を見つけると警告を出す。

>>508
>>1
0511nobodyさん2005/04/14(木) 11:37:45ID:us4u4fSx
Apache拡張ガイド上33pのPerlHandlerについての部分で、下から3行目あたりに、
「サーバーを再起動せずに新しいモジュールをインストールする方法は後述する」
と書かれているのですが、何処に書かれているか、わかりませんorz
どなたかわかりませんでしょうか。
まさかApache::Registryの事じゃないですよね・・・
スレ違いかもしれませんが、お願いします。もしくは誘導先でも。
0512nobodyさん2005/04/14(木) 12:21:12ID:???
DSOが実装されていれば可能だろうね。

なんだかメルヘンな話やね
0513nobodyさん2005/04/14(木) 13:48:31ID:???
やはりDSOのようにmod_perlは使えませんか。。
Registryの事なんでしょうかね。
DSOみたいな薄いラッパーになるハンドラ書けば動くかなぁ。
他にRegistoryの動作を大幅に簡略化するオプションでもあればいいのですが。

ちょっとズレますが、ModPerl::RegistryBBって使ってる方居られます?
これ使う為に、Registory以上に気をつけることとかあるのでしょうか。
0514nobodyさん2005/04/14(木) 14:41:46ID:???
>>511
新しいモジュールをインストールってことは、Apache::StatINC では無いよね?
そもそもインストールだけなら再起動なんていらないけど、
再起動せずにハンドラに加えたいってことかな?
Apache->push_handlers するハンドラを Apache::StatINC で見張ってれば
出来そうな気もする。試したこと無いけど。
0515nobodyさん2005/04/14(木) 16:03:05ID:us4u4fSx
>再起動せずにハンドラに加えたいってことかな?
はいそうです、言葉足らずでしたorz
>Apache->push_handlers するハンドラを Apache::StatINC で見張
なるほど、その方法で出来そうな気が・・・(汗)
けどmod_perlの機能でお手軽に。。ってわけにはいきませんね_| ̄|○
0516nobodyさん2005/04/15(金) 04:54:49ID:???
Mewのinboxにあるメールを検索するスクリプトを書こうと思います。
文字コードがjisなので、以下のようにしましたが、"put search word: "
の部分が画面に表示されません。

use Encode;
use encoding "jis";
print "put search word: ";
chomp($word = <STDIN>);
$word = decode('jis', $word);
while(<>) {
$line = decode('jis', $_);
if ($line =~ /$word/) {
print "$ARGV\n";
}
}

どうしたらよいでしょうか。また、画面表示の部分に日本語を使うことは
できるでしょうか。当方、windows上でcygwinを使用、rxvtの端末文字コードは
sjisにしてあります。
0517nobodyさん2005/04/15(金) 06:28:27ID:ftMFD1Fr
"東京(トウキョウ)"
"世田谷(セタガヤ)"
"北海道(ホッカイドウ)"
"宗谷岬(ソウヤミサキ)"

といった文字列それぞれから、「地名」と「よみ」を抽出したいと考えています。

そこで、以下のようにやってみたのですが、

($chimei,$yomi) = $str =~ /([^(]+)((.+)/;

そうすると、

"宗谷岬(ソウヤミサキ)"の場合だけ、
$chimei -> 谷岬
$yomi  -> ソウヤミサキ
となってしまいます。


文字コードはeuc-jpで処理しており、「宗」の2バイト目と「(」の1バイト目が
同じために、意図しているようにマッチしないということまではわかったのですが、
どのような正規表現を使えばよいかがわかりません。

こういった場合、どのように処理すればよいのでしょうか。

ちなみに、文字コードは以下のとおりです。
宗→\xBD\xA1(->\xA1\xCA

よろしくお願いします。
0518nobodyさん2005/04/15(金) 07:31:33ID:???
>>516
こちらの環境では表示されるので分からんが、出力バッファ絡みなら
print する前に $| = 1; か、print 後に更に print "";

> 画面表示の部分に日本語を使うことはできるでしょうか。
ターミナルが表示できる文字コードで出力すればいいんじゃない。
http://www.kt.rim.or.jp/~kbk/perl-5.8/encoding.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html

>>517
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match
0519nobodyさん2005/04/15(金) 08:21:34ID:ierbYSVR
518さん、ありがとうございました。

以下のようにして解決いたしました。
#!/usr/local/bin/perl

$ascii = '[\x00-\x7F]';
$twoBytes = '[\x8E\xA1-\xFE][\xA1-\xFE]';
$threeBytes = '\x8F[\xA1-\xFE][\xA1-\xFE]';

@str = qw(東京(トウキョウ) 世田谷(セタガヤ) 北海道(ホッカイドウ) 宗谷岬(ソウヤミサキ));

foreach $str (@str){
 (@m) = $str =~ /^((?:$ascii|$twoBytes|$threeBytes)*?)(((?:$ascii|$twoBytes|$threeBytes)+))/;
 print "$str ->".join(",",@m)."\n";
}
05205162005/04/15(金) 12:42:59ID:???
>>518さん、どうもです。
文字コードについてお答えありがとうございました。
夜、家に帰ってからやってみます。
0521質問2005/04/15(金) 16:33:41ID:jvrJ4EBi
タグの中にある改行とタブと二つ以上連続の半角空白を取り除きたいと思います。
例えば
    <BR>市町村 <BR>
  <SELECT
name=pref>
    <OPTION value="" selected>---お選びください---</OPTION>
    <OPTION
    value=川越>川越</OPTION>
    <OPTION value=さいたま>さいたま</OPTION>
    <OPTION
   value=秩父>秩父</OPTION>
    <OPTION value=熊谷>熊谷</OPTION>
  </SELECT>

上のようなHTML文書を
スクリプトによって

    <BR>市町村 <BR>
  <SELECT name=pref>
    <OPTION value="" selected>---お選びください---</OPTION>
    <OPTION value=川越>川越</OPTION>
    <OPTION value=さいたま>さいたま</OPTION>
    <OPTION value=秩父>秩父</OPTION>
    <OPTION value=熊谷>熊谷</OPTION>
  </SELECT>


のように並び替えるにはどうしたらよいでしょうか?

ちなみに
$html = s/((?:\G|>)[^<]*?)\n/$1/g;
のように書いたのですがうまくいきませんでした。
0522nobodyさん2005/04/15(金) 16:38:59ID:???
>>521
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perltrap.html#Perl_Traps
0523nobodyさん2005/04/15(金) 18:14:48ID:???
正規表現ばっか('A`)
0524質問2005/04/15(金) 18:52:11ID:jvrJ4EBi
>>522
ありがとうございました。ちょっと難しすぎて分かりませんでした・・・orz

再び正規表現ですいません。

<市部:さいたま>
<郡部:吉見>
<市部:秩父>
<市部:川越>

 ↓上のデータを

<市部:さいたま市>
<郡部:吉見>
<市部:秩父市>
<市部:川越市>

のように先頭から「<市部:●●>」とマッチングするものを、
「<市部:●●市>」に置き換えるにはどうしたらよいでしょうか
(ただし、「●●」は流動的なものとする)

$data =~ s/<[市部:]*>/<市部:$_市>/;
上のようにやったところ、$_に何も値が入りません。
0525nobodyさん2005/04/15(金) 18:53:41ID:???
>>524
正規表現道場@2ch Part4
http://pc8.2ch.net/test/read.cgi/php/1105930285/
0526nobodyさん2005/04/16(土) 01:58:57ID:zFFmYmjw
http://www.kent-web.com/data/postmail.html
で、確認画面で
パスワードを表示されないようにしたい(現在は表示される)んですけど、

やり方、わかり方、教えてください。

よろしくお願いします。
0527nobodyさん2005/04/16(土) 02:03:03ID:???
>>526
補足事項嫁。
0528nobodyさん2005/04/16(土) 02:09:25ID:zFFmYmjw
>>528

フォーム画面では表示されないのですが、確認画面では表示されてしまいます。
それを隠す方法はあるのでしょうか?
0529nobodyさん2005/04/16(土) 02:26:40ID:???
>>528
>>2の下の方へどうぞ。
05305162005/04/16(土) 18:09:31ID:???
>>518さんにいいページを紹介してもらいました。
いろいろやったら、結局、入力および出力はそれぞれ同じに
しておかなければだめだということが分かりました。つまり、
<STDIN>からの入力とwhile(<>)で読み込む入力が異なって
いたのでだめだったようです。そこで、以下のようにしたら
OKでした。
----------
use Encode;
use encoding 'shift-jis', STDIN=>'shift-jis', STDOUT=>'shift-jis';
$| = 1;
print "input a search word: ";
# print "";
chomp($search = <STDIN>);
print "$search\n";
# $word = encode('jis', $search);
while(<>) {
$line = decode('jis', $_);
if ($line =~ /$search/) {
print "$ARGV\n";
}
}
--------
ご報告まで。

0531nobodyさん2005/04/16(土) 23:26:54ID:???
誘導されてきました。
質問は下記にあるものなのですが、なにとぞ教えてください。


PerlでCGIなのですが、
例えば十個の$a1,$a2…$a10があり、
ここに10をランダムに格納していきたいのです。
…うまく説明できない…

例えば、
一回目は $a1=2,$a2=3,…$a10=1 でトータルで10
二回目は $a1=4,$a2=1,…$a10=2 でトータルで10
これを十回繰り返す。

という具合です。
判り難くて申し訳ないのですが、
なにとぞご教授下さいませ。
0532nobodyさん2005/04/16(土) 23:41:29ID:???
下手すると無限ループになりそうだな
0533nobodyさん2005/04/16(土) 23:44:21ID:???
つーか意味不明。やりたいことだけ書けよ。
0534nobodyさん2005/04/16(土) 23:46:51ID:???
10個の変数のトータルが10なら全部1しかありえない気がするが
0535nobodyさん2005/04/16(土) 23:48:26ID:???
1〜10じゃないの
0536nobodyさん2005/04/16(土) 23:58:37ID:kx2lH57m
すみません…どうもうまく説明できなくて…

for($i=0;$i<=10;$i++){
?????????????????
}

↑
この?部分で$1~$10に限られた数値をランダムで入れていきたいのですが、
その処理の仕方がわからないのです。
0537nobodyさん2005/04/17(日) 00:01:52ID:???
配列にすれば?
0538nobodyさん2005/04/17(日) 00:22:26ID:???
>>531
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_do_I_shuffle_an_array_random
http://boobar.hp.infoseek.co.jp/bench/randlist.txt

sub rand_num {
  my @num = @_;
  for (my $i = @num; --$i;) {
    my $j = int rand($i + 1);
    $j == $i && next;
    @num[$i, $j] = @num[$j, $i];
  }
  @num;
}

for (1..10) {
  print "$_ - ";
  my($a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10) = rand_num(1..10);
  print join '/', $a1, $a2, $a3, $a4, $a5, $a6, $a7, $a8, $a9, $a10;
  print "\n";
}
0539nobodyさん2005/04/17(日) 13:12:59ID:???
10個の似たような変数を使うなら、配列にするのが常識。

その上で、やりたい事がイマイチよく分からん。
10個の数の満たすべき条件は何?
10個の合計が10になる事?
それとも、ひとつひとつの数が0以上10以下の範囲ならいいの?
0540nobodyさん2005/04/17(日) 14:33:17ID:???
>>538
前々から気になってたんですが、
その perlfaq に載ってる方法のランダム性ってどうなんですかね?

例えば 1,2,3,4,5,6,7,8,9,10 と綺麗に並んだのができる確率って
splice 使う方法だと 1/10! になりますが
速い方のだと明らかにこれより大きくなりますよね?
0541nobodyさん2005/04/17(日) 16:08:52ID:???
1/11!じゃないの?
0542nobodyさん2005/04/17(日) 16:17:38ID:???
>>540-541
プログラミングの為の数学と算数 vol.2
http://pc8.2ch.net/test/read.cgi/tech/1094368921/
0543T女の竹田2005/04/17(日) 16:21:33ID:???
>>531
こんなのはどうかな?

@hash{1..10} = ();
@array = ();
for (1..10) {
$array[$_] = (keys %hash)[int(rand(11-$_))];
delete $hash{$array[$_]};
}
0544T女の竹田2005/04/17(日) 16:27:32ID:???
考えてみたらハッシュ使う必要なかった…
spliceの方がいいし。忘れてください。
0545nobodyさん2005/04/17(日) 19:06:27ID:???
>>531
シャッフル?
List::Utilが使えるのなら、List::Utilのshuffleで。

use List::Util qw(shuffle);

for(1..10){
my @a = shuffle(1..10);
print "@a";
}
0546nobodyさん2005/04/18(月) 17:36:57ID:uIr0c1v3
質問させてください。
ActivePerl-5.8.4.810-MSWin32-x86.msi
OS:XpSp2
を使っています。

$pack = pack("C*", 0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00);
とすれば普通にパックしてくれるのですが

$pack = "0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00";
$pack = pack("C*", $pack);

とした場合、パックしてくれません。
@pack = (0x7E, 0x00, 0xFE, 0x40, 0x52, 0x00);
$pack = pack("C*", @pack);

としてみた場合も同じです。
0x7Eみたいなデータを変数にいれてpackするには
どうしたらよいのでしょうか?
アドバイスいただけるとありがたいです。
0547ero 141-190-213.biwa.ne.jp/2005/04/18(月) 18:39:47ID:???
え  っしと  のぉハァ   う  w  ww うぇうぇ   w                 
 ぇ          ハ               っ                    
  け                                              
       る      ァ  w おk  w                         
                は            w  w                
     
0548nobodyさん2005/04/18(月) 18:48:21ID:???
>>546
あとの方でいけると思うが。一応試してみたが大丈夫だぞ?

% perl -e 'print pack("C*", 0x7e,0x00,0xfe,0x40,0x52,0x00)' | hex
0x00000000: 7e 00 fe 40 52 00 - ~@.@R@
% perl -e '@pack=(0x7e,0x00,0xfe,0x40,0x52,0x00); print pack "C*", @pack' | hex
0x00000000: 7e 00 fe 40 52 00 - ~@.@R@

0549nobodyさん2005/04/18(月) 19:20:44ID:???
perl -M<module_name>
の-Mの意味が分かりません。
ググってもわかりませんでした。
よろしくお願いします。
0550nobodyさん2005/04/18(月) 19:34:27ID:???
>>549
スレタイ読もうね。
0551nobodyさん2005/04/18(月) 19:34:36ID:???
module_nameで指定したモジュールがインストールされていれば、それを読み込んでperlを起動する。
例えば、
perl -MJcode hoge.pl
とかすると、hoge.plでJcodeをuse宣言してなくてもJcodeモジュールが使える。

まあ、使いたかったら普通にスクリプト内でuse書いておけばいいわけだし、普通の人間には不要。
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";
}
}
■ このスレッドは過去ログ倉庫に格納されています