Perlについての質問箱 11箱目

このエントリーをはてなブックマークに追加
#!/usr/bin/perl
$|=1;
&abone;
sub abone {
print $$,"(oya)\n";
if( fork() ){}
else{print $$,"(child)\n";}
}
exit;

を実行するとPerlインタプリタが落ちて

#!/usr/bin/perl
$|=1;
print $$,"(oya)\n";
if( fork() ){}
else{print $$,"(child)\n";}
exit;

だと落ちないのは何でですか?

WinXP Pro SP1,ActivePerl 5.8.4
642641:04/08/22 15:25
友人のMacOSXではエラーが出ませんでした。
ActivePerl特有の問題なのでしょうか
>>641
問題なし。

$ perl -v

This is perl, v5.8.5 built for cygwin-thread-multi-64int
644641:04/08/22 15:41
もう一人の友人も同じ様な環境(Windows)なんですが、やはりエラーが出て強制終了されたと言ってました。

>perl -v

This is perl, v5.8.3 built for MSWin32-x86-multi-thread
(with 8 registered patches, see perl -V for more detail)
>>641
うちも一つ目は落ちる。
環境は WinXP Home + ActivePerl  v5.8.3
646デフォルトの名無しさん:04/08/22 15:47
This is perl, v5.8.5 built for MSWin32-x86-multi-thread

うちのこれでエラーになるね。
Access ViolationだからPerlのバグだな。
647641:04/08/22 15:52
これ、ActiveStateに報告した方が良いんでしょうか…
自分もサブルーチン内で子プロセスが作成できなくなると、不便ですし…
648デフォルトの名無しさん:04/08/22 15:53
ActivePerlじゃなくてもエラーになるよ。
自分でビルドしたものでも。
649641:04/08/22 16:03
#!/usr/bin/perl
$|=1;
&abone(); ←*
sub abone {
print $$,"(oya)\n";
if( fork() ){}
else{print $$,"(child)\n";}
}
exit;

としたら動きました
650デフォルトの名無しさん:04/08/22 16:06
完全にバグだな。
/■\
( ´∀`)バグワショーイ
うちはバグらないですけど。
v5.8.5 built for i386-freebsd-64int
これってバッファオーバーフローじゃないよね?
654デフォルトの名無しさん:04/08/22 19:49
ですが、なにか?
とほほのperl入門より
> ◆ fork()
> 子プロセスを生成し、親プロセスと子プロセスに分岐する。親プロセスの場合 $pid には子プロセスのIDが、
> 子プロセスの場合、$pid には 0 が返る。fork() をサポートしていないシステムもあり、
> 無理に使用すると perl が異常終了する。
サブルーチン内に含むか含まないかで、
バッファオーバーフローが発生するって問題じゃないのk
これを利用したセキュホまだ?
exploitまだー?チンチン
exploitってなにー?チンチン
660デフォルトの名無しさん:04/08/24 02:33
書き込みがないので捕手
661デフォルトの名無しさん:04/08/24 09:43
CGIでMDBから日付型のデータを拾うと
Win32::OLE::Variant=SCALAR(0x1d551dc)
と表示されます。これを日付として表示させるにはどうしたらいいでしょうか?

$conn = 'Provider=Microsoft.Jet.OLEDB.4.0;';
$conn .= 'Data Source=test.mdb';
$db = Win32::OLE->New('ADODB.Connection');
$db->Open($conn);
$rs = $db->Execute("SELECT * FROM AAA ;");
while (!$rs->EOF) {
print $rs->Fields('日付')->Value;
print $rs->Fields('名前')->Value;
$rs->MoveNext;
}
$rs->Close();
$db->Close();
exit;

-結果-
Win32::OLE::Variant=SCALAR(0x1d551dc)テスト君

Win2K,ActivePerl5.8.4,Access2000
>>661
黙ってCGI板いけ池沼
>>661
print ${ $rs->Fields('日付')->Value };

http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlref.html#Using_References

my $foo = 'foo';
$foo = bless \$foo, 'Foo';
print $foo; # Foo=SCALAR(0x10c5f50)
>>662
何言ってるんだ?
呼ばれたサブルーチンが自分自身の名前を得るにはどうすればよろしい?
>>665
$this_function = (caller(0))[3];

と、クックブックのP348に書いてあった。
667デフォルトの名無しさん:04/08/24 12:22
>>666
ありがたう
669661:04/08/24 18:46
663さん、レスありです。

use Win32::OLE::Variant;

上行のVariantを追加したらちゃんと表示できました。
すいません。

$pid = open(SAFR_WRITER, "|-"))

if($pid) {
  なんとか
} else {
  なんとか
}

でコレでfork出来ているんでしょうか?

よく
$pid = fork();
if( $pid ) {
  なんとか
} else {
  なんとか
}

はほとんど同じなんでしょうか?

forkの使用例ページでは後者がよく載っているのですが、
前者だとあまり解説がなくて・・・
671670:04/08/24 19:35
すんません。

もうお分かりかもしれませんが、

defined ($pid = open(SAFE_WRITER, "-|")) or die "Can't fork: $!";
if($pid) {
  なんとか;
} else {
  なんとか;


でした。
forkよりthread使うのが正しいんじゃないの
fork は間違いなの?
Windowsで動かないじゃん
forkは一応ー動くよ。
シグナルがほとんどきかんし、いろいろと使いづらいが。
WIN32::APIを使ってC++で書いたDLLの読み込みをしたいのですが、
Perlの小技に載ってる例を見てもわかりませんでした。
hoge.dll:
...
class HOGEAPI Hhoge{
public:
Hhoge(void);
~Hhoge(void);
char* bumo;
HWND hwnd;
Ppiyo* piyo;
...
}

class HOGEAPI Ppiyo{
public:
Ppiyo(long aa, BYTE* bb);
~Ppiyo(void);
float piyoA(void);
float piyoB(void);
LPCTSTR piyoC(void);
...
}
例えばこういうDLLの場合、piyoA()等を使うにはどのようにしたらよろしいのでしょうか?
677デフォルトの名無しさん:04/08/25 12:25
そのDLLにコア吐かせて、それをPerlで読み込んでゴニョゴニョ
でもいい?
>>677
レスありがとうございます。
その方法でできるようでしたら是非教えて頂きたいです。
ですがかなり頻繁に呼び出すので(秒間100回以上)
コアダンプを拾って・・・というのは処理的に厳しくはないでしょうか?
そんなコア産んだ覚えありません。
680デフォルトの名無しさん:04/08/25 19:06
>>678
ネタにマジレスカコワルイ
Windows-ActivePerlでとBorland C++ Compiler 5.5を利用し、
Perlモジュールをインストールしようと考えています。

BC++は正しくインストールしました (念のためHelloWorldをコンパイルして実行した)
dmakeも正しくインストールしました
comfig.pmのnmakeをdmakeに書き換えました

しかし、perl Makefile.PL 〜 dmake を実行すると以下のようになって止まりました
ちなみに、Time-HiRes1.52をdmakeしたときの出力です。

C:\temp\Time-HiRes-1.52>dmake
cp HiRes.pm blib\lib\Time\HiRes.pm
C:\Perl\bin\perl.exe C:\Perl\lib\ExtUtils/xsubpp -typemap C:\Perl\lib\ExtUtils\
typemap -typemap typemap HiRes.xs > HiRes.xsc && C:\Perl\bin\perl.exe -MExtUtil
s::Command -e mv HiRes.xsc HiRes.c
bcc32 -c -nologo -Gf -W3 -MD -Zi -DNDEBUG -O1 -DWIN32 -D_CONSOLE -DNO_STR
ICT -DHAVE_DES_FCRYPT -DNO_HASH_SEED -DPERL_IMPLICIT_CONTEXT -DPERL_IMPLICIT_SYS
-DUSE_PERLIO -DPERL_MSVCRT_READFIX -MD -Zi -DNDEBUG -O1 -DVERSION=\"1.
52\" -DXS_VERSION=\"1.52\" "-IC:\Perl\lib\CORE" -DSELECT_IS_BROKEN -DATLEAS
TFIVEOHOHFIVE HiRes.c
Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
エラー E2075: コマンドライン オプションの間違い : -Gf
dmake.exe: Error code 1, while making 'HiRes.obj'

bcc32に渡す引数が間違っているのはもちろん分かりますが、
Perl側設定のどこをどう直せばうまくいくのか見当がつきません。

設定すべき箇所について教えて頂けませんでしょうか?
後網一歩だと思うのですが......
>>681
OSを変える
683デフォルトの名無しさん:04/08/26 02:12
Config.pmを書き換えることを知っているのに、そのファイルの中から-Gfを探そうとは思わないんだな。
ActivePerlってBCC++でモジュール作れたっけ?
どーせならBCC++でPerlを作ったら? それなら確実。
>>681
perl Makefile.PL で作られた Makefile を書き換える。
686デフォルトの名無しさん:04/08/26 11:13
>>684
Cがひとつ余計
それはそれでええやん
CSVファイルの解析について質問があります。

今まで use Text::ParseWords を使ってましたが、
これでは解析出来ないデータが出てきまして、、
自分の頭では出来ませんでしたので、知恵をお借り出来ますでしょうか。

データの内容は以下の通りです。

- データはasciiのみ
- デリミタは , (カンマ)
- 数値以外のデータは " (ダブルクォーテーション)で挟まれる
- データ内に " ' , が含まれる、そして "" \" のようにエスケープされている訳ではない

# 自分で書いてみたモノの一部

push(@arr, $+) while $line =~ m{
  "([^\"]+)",?
  |([^,]+),?
  |,
}gx;

自分で書いてみたものの、
上記のコードだと " が含まれるデータは解析出来ず、、orz
689688:04/08/26 16:18
いつから & は & に変換されるようになったんだ、、、orz

push(@arr, $+) while $line =~ m{
 "([^\"]+)",?
 |([^,]+),?
 |,
}gx;
690688:04/08/26 16:20
あぁぁぁああああ、、、、_| ̄|○変換の基準がワカラネー、、、

> いつから & は & amp; に変換されるようになったんだ、、、orz
インデントは全角スペースにしとけって
厨房板とかで試してから投稿しような
>>688
下の文字列はその仕様を満たすが、これを
どこで区切るのがお望みの挙動だい?

1,",",",",",2,",",",",",3

解析方法で悩むよりデータ構造を見直す事を勧める。
メタ文字自身のエスケープが仕様に盛り込まれてないデータ表現形式は糞。
> CSVファイルの解析について質問があります。
大人しく Text::CSV 使えよ(笑)。
>>692 ほんとごめんなさい。

>>693-694 仰る通り過ぎて返す言葉がございませぬ。
自分でやる時はもう絶対そうするんですけど、
今回は、、もうデータがあるんですよ、そこで困っている訳でございます。

中身を見た瞬間ガックリですよ、ハイ。

>>693
数値以外のデータは全て "(ダブルクォート)で挟まれるので、
そのデータだと↓ようになりますです。

1,""",""",""",""",""",2,""",""",""",""",""",3

で、こんな風に自分のコード改造してみました。
一応、手持ちのデータは解析出来るようになったので解決と言っても良いのですが、
折角なのでもっと良い方法があれば教えて下さいませ。

push(@arr, $+) while $line =~ m{
 "(.+?)",
 |"([^\"]+)",?
 |([^,]+),?
 |,
}gx;
697688:04/08/26 18:26
>>696 は私です。

>>695 シマッタ、、それ知りませんでした、、orz、、使ってみます。
698688:04/08/26 18:43
Text::CSV 使ってみました。
結果は Text::ParseWords と殆ど同じです。

やぱーり自分で書かないとダメみたいす(つд`;)
>>696
いや、違うって。
1,",",",",",2,",",",",",3 は >>688 の仕様を満たし、且つ
1 , ",",",",",2,",",","," , 3 とも、
1 , "," , "," , ",2," , "," , "," , 3 とも、
1 , ","," , ",",2," , ",","," , 3 とも、
如何様にでも解釈できる文字列だって事。君が挙げた以外にまだ
何らかのルールが存在していないとこれを機械的に切り分ける事は
不可能で、故にそれを説明してもらわなければ誰もコードに落とせ
ない。

>>696 のコードは、文字列中に " も , も含まれ *ない* という条件の
下でなら意図通り動くだろう。しかしそれは君の示した仕様とは異なり、
仕様を違えた回答は君の手元のデータを上手に切り分けられる確証
が無い。故に「もっと良く」と言われても答えようが無い。
でも、お客さんがつくったデータってこういうの多いんだよね。
よっぽどデータ量が多くなければ、editor上でinteractiveに
正規表現置換かけるやり方も検討したほうがいい。
それはメモ帳でできますか?
まず、

@a = split /,/, $hoge;

する。 validなデリミタで区切られたところならば、
たとえば、 $a[0]の末尾は 「"」 or [0-9]で、なおかつ、
$a[1]の先頭も同様。それ以外なら $a[0]と$a[1]を連結すると。

でも、セル(?) の中身が 「"...",1,2,3,"hogehoge"」だったら
原理的にどうやっても破綻するんだから、これはPerlの問題じゃなくて
そのヘッポコ元データを出してきた奴(客?)との交渉術の問題だろう。

理屈で攻めて飯でもおごらせろよって感じだなあ。
>>688
悲惨だなとしか言いようがない。
う〜ん、だるいけどとりあえず各行のカンマ区切りの配列を生成して
その中で要素数が最小のものを参考に他の列の配列を再定義するのはどうだろうか。
基本方針は>>702の方法で。

これなら>>702の言う 「"...",1,2,3,"hogehoge"」で分割される問題も
他の行も同様に分割されるか最小要素数にあわせて分割されないに違いない(と信じたい)。

まあこの方法の最大の問題は各行でもともと要素数が違う場合だな。

交渉がんがれw
まぁ、もう十分わかりやすいけど、もう一度書いておくと、

"...",1,2,3,"hogehoge"

というデータがあった場合、最初の要素は、

"..."

とも、

"...\",1,2,3,\"hogehoge"

とも解釈できてしまう、ということだね。これはプログラム側で
一意に解釈することは「不可能」。で、
>>703 のように無理やりルールを決めて処理するしかない。

それでも破綻するなら、一度元データから
きちんとしたデータを作るとよいかも。
(""中の"をエスケープして)
それだと既存のモジュールで処理できるので。
追記。データ変換は手作業になるけど。
706688:04/08/27 11:13
>>699
あ、そう言う事でしたか。(読解力無くて申し訳ない..)

> 如何様にでも解釈できる文字列だって事。

いや、仰る通り、それなんですよ。
「如何様にでも解釈出来る文字列」が含まれるCSV(モドキ)データなので、
激しく困っているのでございます。
# これは拡張子がcsvなだけだ、絶対そうだ、中身は単なるtextだ、違うとは言わせない

> 何らかのルールが存在していないとこれを機械的に切り分ける事は不可能

やっぱそうですよね、、と言う事で考えを改めまして、
「万能」な全てにマッチする正規表現は不可能、ならば、
全fields数 x になるように split すりゃいいのだ(半壊

と言う事で、
1. Text::ParseWords で解読
2. 正規表現其の壱で解読
3. 正規表現其の弐で解読
4. 正規表現其の参で解読
5. split m#,#, $line して変な所は合体(壊

としてみました。
んで、どーにもならないデータは手動で置換してみた。
したらこんなの見つけた。

0,1,****"ab"cde,fgh"ijk,lmn"op",2,3

どうやってマッチさせろと、、
つか文字列は " で囲まれてるんじゃないのかよ、、orz
# これバグ、絶対そう、違うとは言わせない
707688:04/08/27 11:54
皆様、本当にありがとうございます。沢山参考にさせて頂きました。

>>700 ちょと泪出てきました(つд`;)ワカッテクレテアリガトー
>>701 メモ帳以外をお勧めしまつ。# 個人的にはvi(ry
>>702 最終的にはソレ使わせて頂きました。ありがとうございます。

> でも、セル(?) の中身が 「"...",1,2,3,"hogehoge"」だったら

そーいう解読不能データ、約9000(全数は2マソホド)あったんです、、
文句言った時に1万ないから楽勝じゃん、なんてヌカしやがった上司にちょと殺意が、、

そしてこのデータ出してきた奴には、
- CSVデータならちゃんと , で区切れ
- データに , が含まれるなら " で囲め、なんでもかんでも囲むなゴルァ
- " で囲んだデータに " が含まれるなら "" or \" でエスケープしてコイ
- エスケープしたり " で囲むのメンドーとか抜かすなら \t で区切ってコイ、勿論データ内の \t は消せ
- 兎に角、定義を破るな、死んでも破るな、破るなら氏ね
と、和菓子で包んで突っ込んでみました。んで返事は「善処する」だそうです。
# あー多分私、どこかの政治屋さんに間違えてメールしたんですね
708688:04/08/27 11:56
あ、最後に一つだけ質問です。
困ったと言うほどの事でもないのですが、

.(ピリオド)は \x2E
'(シングルクォート)は \x27
と記憶していたのですが、
. だと思われる所に \x85
' だと思われる所に \x92

と言う文字が入っているデータがあったのです。
こんな文字コードが含まれる事なんてあるのですか?
# asciiと呼ばれる文字にも二種類ある?!

少し調べてみたら usコード?の \x85 は ... <-コレで一文字
\x92 は '(シングルクォート)そのものを指し示しているコード表があったのですが、
どうも納得できるものではありませんでした。

何かご存知の方いらっしゃいましたら教えて下さい。
Excelに流しこんで、テキスト(タブ区切り)で吐き出すのは?
711688:04/08/27 13:13
>>709
> Excelに流しこんで、テキスト(タブ区切り)で吐き出すのは?

Excelに読み込む時点でズレまくります。
そもそもfieldが256以上使えない時点で選択肢に挙がりませぬ。

>>710
あ、そうでした、申し訳ない。行って来ます。
<FORM method="POST" action="hogehoge">
<INPUT type="submit" name="Reload" value="再読込">
</FORM>
こんな感じでホームページに設置されているボタンを押すPerlスクリプトって作れないでしょうか。
>>712
>>1 板違い
すみません。移動します。
715デフォルトの名無しさん:04/08/27 21:13
perl初心者です。

>dnaK
atgacgtgggttacgaccccatttagtagtcaaccgcagtga
atgaaattgggcagttga
>dnaJ
>gef
atgaagagataa
atgcgaggcgtcttccggattagaatcgataaaacagaatgggttaaagagagcgatataatagcggcgggtgcttga
atgggttaa
>nhaA
atgattatcagggcttag
atggcgcaaattcttctatag
atgattcgtgcggggtaa
>nhaR
というような出力結果から、
716デフォルトの名無しさん:04/08/27 21:14
715の続きです
>dnaK
2
>dnaJ
0
>gef
3
>nhaA
3
>nhaR
0
という結果( つまり、「>名前」に対応させた、塩基配列の行の数)を出力し
たいのですが、プログラムがわかりません。どなたか教えてくださるかたがい
らっしゃるとうれいしです。よろしくお願いします。
>>715
マルチになってますがどうなさいますか?
718デフォルトの名無しさん:04/08/27 21:51
返答ありがとうございます。マルチのままでなくて結構です。できれば
名前 数 の形がいいです。ほんとすみません。
>>715-716
http://ja.wikipedia.org/wiki/%E3%83%9E%E3%83%AB%E3%83%81%E3%83%9D%E3%82%B9%E3%83%88

#!/usr/bin/perl -- sum.p
my $i;
/^>(\w+)/ ? (print("$i\n$1 "), $i = 0) : $i++ while <>;
print $i;
__END__

prompt> cat ./data.txt | ./sum.p
Perl初心者です。
質問があります。

ある特定の文字■を文字列としての<\n>に置き換えようと、
s/■/\Q<\n>\E/g;
というタグで処理しようとしたんですが、
すべて
>
<
という二行に変わってしまいます。
アウトプットを<\n>にしたいのに…
どうしても\nとして処理されてしまうようで頭を抱えています。
なにかいい方法をご存じないでしょうか?
>>720
>なにかいい方法をご存じないでしょうか
perlの本を一冊読む
>>720
s/■/<\\n>/g;
723デフォルトの名無しさん:04/08/27 22:24
>>719
マルチポストのことでしたか。すみませんでした。以後気をつけます。

簡潔なプログラムをありがとうございます。
本当に助かりました。
ありがとうございました。
724720:04/08/27 22:41
>722

ありがとうございました!
\Q...\Eがきかなくてテンパってました。
本当に助かりました。
ちょっと質問です。
x.plというPerlプログラムを使って
a.txtをb.txtに変換するとき
必ずc.txtの内容をb.txtの冒頭に含めることってできますか?
できればx.plひとつかますだけでできるようにしたいんですけど。
よろしくお願いします。
1. b.txtを書き込みで開く。
2. c.txtを読み込みで開く。
3. c.txtのファイルハンドルから読んでb.txtへのファイルハンドルに書き出す。
(c.txtへのファイルハンドルはそのまま閉じずに)
4. a.txtを読み込みで開く。
5. a.txtから読んでは処理してb.txtに書き出す。

でいいんでわ?
727726:04/08/27 23:45
誤: (c.txtへのファイルハンドルはそのまま閉じずに)
正: (b.txtへのファイルハンドルはそのまま閉じずに)
728725:04/08/27 23:51
質問内容が曖昧ですいません。
% perl x.pl < a.txt > b.txt
とやって、b.txtをアウトプットするとき、
自動的にc.txtがb.txtの冒頭に含まれるようにするための
x.plに記述するタグを知りたいんです。
729デフォルトの名無しさん:04/08/28 00:07
perl初心者です。

>dnaK
atgacgtgggttacgaccccatttagtagtcaaccgcagtgaatgaaattgggcagttga

>gef
atgaagagataaatgcgaggcgtcttccggattagaatcgataaaacagaatgggttaaagagagcgatataatagcggcgggtgcttgaatgggttaa

>nhaA
atgattatcagggcttagatggcgcaaattcttctatagatgattcgtgcggggtaa
という出力を、

730デフォルトの名無しさん:04/08/28 00:08
>>729続きです。

>dnaK
atgacgtgggttacgaccccatttagtagtcaaccgcagtga
atgaaattgggcagttga

>gef
atgaagagataa
atgcgaggcgtcttccggattagaatcgataaaacagaatgggttaaagagagcgatataatagcggcgggtgcttga
atgggttaa

>nhaA
atgattatcagggcttag
atggcgcaaattcttctatag
atgattcgtgcggggtaa

のように開始コドンatg〜終止コドンtaa tag tgaまでで区切りたいのですが、
プログラムがわかりません。どなたか教えていただけるとうれしいです。
731デフォルトの名無しさん:04/08/28 00:09
>>730続きです。
のように開始コドンatg〜終止コドンtaa tag tgaまでで区切りたいのですが、
プログラムがわかりません。どなたか教えていただけるとうれしいです。
よろしくお願いします。
>>729
マルチになってますがどうなさいますか?
733ゆうき ◆MU2000.LWc :04/08/28 00:37
$keysin = "asdf1234";
if( $in_params[5] eq $keysin ){
  ・・・・
}else{
  ・・・・
}

どこかオカシイですか?(泣)
助けてクダサイ。。
>>733
asdf1234 じゃなくて asdf0123 じゃないの?
735ゆうき ◆MU2000.LWc :04/08/28 00:48
ただゲームのネットランキング作りたいためにやってるヘタレです。
CGIは板違いでした。ごめんなさい。
>>734
いや、そこは何でもいいのです。
ソフト名とバージョンが入る変数?
もっと別のところかも。出直してきます。
>>728
タグってなんだ?新たな釣り?
737ゆうき ◆MU2000.LWc :04/08/28 01:05
自己解決しました。
$in_paramsに改行コードが orz...
スレ汚してすんませんでした。
>>737
別に改行コードが入ってても問題ないだろ?>733は
「Perlで配列の要素数を取り出すにはどうすればいいですか?」
という質問だと思ったんだが。
質問書いてないってことは 貴様らが質問を予想しろ ってことだろ。
>>730
$enki = q/atgattatcagggcttagatggcgcaaattcttctatagatgattcgtgcggggtaa/;
@part = $enki =~ /((?:atg)(?:\w{3})*?(?:taa|tag|tga)(?=atg|$))/g;
print $_, qq/\n/ for @part;

ほれ。
Perlに感謝してこれからはPerlerになりたまへ
最後の (?=atg|$) は冗長だった予感
DESの仕様が載っているサイト教えて下さい
>>741
ググりゃすぐ出てくるだろ
http://www.itl.nist.gov/fipspubs/fip46-2.htm 
DEATHの仕様が載っているサイト教えて下さい
>>741
wikipediaりゃすぐ出てくるだろ
http://en.wikipedia.org/wiki/Death
>>744
英語読めないので・・・・・
オンドゥル語に訳してもらえませんか?
>>745
そのレスをオンドゥル語で書いてください。
>>744
エイゴヨベナイドディ・・・・・
オンドゥヅゴルャグジデボラエバゼンカ?

これでどうでしょうか?
748725:04/08/28 18:28
>726

解決しました。
x.plの冒頭部分に、

open(IN, "c.txt");
print while (<IN>);
close(IN);
print "\n";

これで問題なくb.txtの冒頭にc.txtの内容を含めることができました。
示唆していただきありがとうございました。
750デフォルトの名無しさん:04/08/29 06:47
>>744
つまらん
751デフォルトの名無しさん:04/08/29 12:29
Visual Perl 使っている人いますか?
使ってみようと思ってるけど情報が少なすぎ。。
具具っても英語わからんし。
ttp://www.activestate.com/Products/Visual_Perl/
俺が今から入れてみるよ。
753デフォルトの名無しさん:04/08/29 15:28
>>256のような事を、連想配列のキーと値ではなく、二つの配列を用意して行いたい
のですが、良い記述が思い当たりません。それぞれの値を連想配列に代入する
以外に良い方法は無いものでしょうか・・・?
>>753
my @key = sort { $hoge{$b} <=> $hoge{$a} } (keys %hoge);
my @value = @hoge{@key};
>>753
したい事がよく分からんがこういう事?

my @value = qw(blue green indigo orange red vioret yellow);
my @order = (2, 3, 1, 5, 6, 0, 4);
print join ', ', @value[ sort { $order[$a] <=> $order[$b] } 0..$#value ];
>>751
とりあえず、新規プロジェクトのテンプレートとして用意されているもの
・Simple Project
・Empty Project
・Control Library
・Managed Dll Library
・Executable
・Managed Exe
・Tray Application
・Windows Service
CGI Projectとか無いのか
ActivePerl 5.8.4ではUnicode独自文字を含むファイル名は開けないのでしょうか。
5.8.1までは${^WIDE_SYSTEM_CALLS}とか-Cオプションがあったのですが…
759デフォルトの名無しさん:04/08/30 02:19
どなたか教えてください。
perl 5.6 で動いていたperlのスクリプトが5.8で動かなくなってしまいました。

my %$test = {};

という宣言がエラーになってしまうのです。
これを5.8で動くようにすればどのような宣言にすればいいのでしょうか。


書いたプログラマがいなくなってしまい、自力でリファレンスのことを
一応調べてみましたが、日頃php使いのためよく理解できず困っています。

識者の方どうか力をお貸しください
>>759
my $test;
%$test = {};

でいいと思われ。
でも、%$testに空の無名ハッシュを代入するのって意味があんのかな?
エラーにはならんけどさ。
my %$test = {};
↑ハッシュにスカラー代入してる時点でなんか変じゃない??

my $test = {};
の間違いでは??
%$test = ({}=>undef);

と同じことではある。こんなことがしたいのか?
%$testを空のハッシュにするつもりで間違えてる
ような気はするが、keys %$testとかとらなきゃ
それなりに動くから気がつかないこともあるかな。
764759:04/08/30 09:21
ありがとうございます。

>> 760さん
my $test;
%$test = {};

>> 763さん
my %$test = ({}=>undef);

ではそれぞれエラーがとまりましたが、プログラムは正常に動きませんでした。

この変数は宣言された後、
my %$test = {};
$test = ("hoge"=>"aaa");
のような使われ方をしていて、 %$ という表現は
変数宣言のところにしか出てこないようです。

>$test = ("hoge"=>"aaa");
多分、文法ミスじゃないかと。

$test = { hoge => 'aaa' } とか。。。
766759:04/08/30 09:44
すいません。

$test = {__TEST__ => "test"};
のような書き方です。
上記の変数宣言をコメントアウトすると正常に動かなくなってしまいます。
767デフォルトの名無しさん:04/08/30 10:10
perl初心者です。どなたか教えていただけるとうれしいです。
ファイル1            ファイル2
a 1              b 3 
b 3 c 5
c 4 d 7
f 2 g 1
g 0 h 5
h 6 i 3
(下に続く) (下に続く)
という二つのファイルがあるのですが、これら二つのファイルを参照させて、

出力ファイル            
b 3  3
c 4 5
g 0 1
h 6 5
(下に続く)
のように、その二つのファイルで名前(この場合アルファベット)が一致する
ものの数字を並べて表示するというようなプログラムがわかりません。
どなたかよろしくお願いします。
768デフォルトの名無しさん:04/08/30 10:16
うまくでなかったのでもう一度貼ります。
perl初心者です。どなたか教えていただけるとうれしいです。
ファイル1          
a 1               
b 3              
c 4              
f 2              
g 0
h 6
(下に続く)
ファイル2
b 3 
c 5
d 7
g 1
h 5
i 3
下に続く

という二つのファイルがあるのですが、これら二つのファイルを参照させて、

出力ファイル            
b 3 3
c 4 5
g 0 1
h 6 5
(下に続く)
のように、その二つのファイルで名前(この場合アルファベット)が一致する
ものの数字を並べて表示するというようなプログラムがわかりません。
どなたかよろしくお願いします。
データ構造つくることかね。。。
{
  a => [ 3, 2],
  b => [ 1 ],
  c => [ 4, 5 ],
}
のような・・・
use Data::Dumper;
my %alpha;
while(<>){
s/ / /g;#全角スペース区切り対策
my %list = split;
my ($key, $value);
while(($key, $value) = each %list){
push @{ $alpha{ $key }}, $value;
}
}

print Dumper(\%alpha);
入力ファイル形式変わってたのか。。。
じゃ、こっちと
use Data::Dumper;
my %alpha;
while(<>){
  s/ / /g;#全角スペース区切り対策
  my ($key, $value) = split;
  push @{$alpha{ $key }}, $value;
}

print Dumper(\%alpha);
772デフォルトの名無しさん:04/08/30 12:36
ttp://www11.tok2.com/home2/whitedragon01/upload/up.htm

粗大ごみ不法投棄させてもらいますね
>>765
>$test = { hoge => 'aaa' } とか。。。
これだけなら
my $test = {};
でOKだと思うけど・・・

これでも動かないんじゃ↑の代入文以外で$testが使われてる部分晒してもらえないと分からんね
>>768

>>771 の出力を >>768 のようにしたいなら、最後の行を

print map { "$_ ".join(' ', @{$alpha{$_}})."\n" } sort grep { @{$alpha{$_}}>=2 } keys %alpha;

>>771 の使い方は、コマンドラインで

perl 771.pl ファイル1 ファイル2
775デフォルトの名無しさん:04/08/30 17:28
>>774
本当に丁寧にありがとうございました。
なかなかできないでいたのを、出力の形式まで
そろえていただいて感動しました。


776デフォルトの名無しさん:04/08/30 19:04
perl初心者です。
いつもこの板の方々には大変感謝しています。
またわからないところがあったので質問します。

>fixA
atggacgcgttaatggctaactcataa
atgggtattcaataa
atgttatgttatgttgcgagtaaaaaaatagcatctgactttcaatattggtga
atgttatgttgcgagtaa
atgttgcgagtaaaaaaatag
>yabH
atgacaggtatgataatgcaaattataggcgatgtcccacaattgaccgcagccggaaaacggtaa
atgtcccacaattga
>imp
atgccgtgcctaacaccactgacgctattcggacaggattaa
atgacgagtacgttagtctctgaccgtttgtcacgcgcaacgttaccgatgatggaacaataa
>araC
atggacaattggtttcttctctga
atggcgggagtatga
というファイルを

777デフォルトの名無しさん:04/08/30 19:06
>araC
atggacaattggtttcttctctga
atggcgggagtatga
というファイルを
>fixA_1
atggacgcgttaatggctaactcataa
>fixA_2
atgggtattcaataa
>fixA_3
atgttatgttatgttgcgagtaaaaaaatagcatctgactttcaatattggtga
>fixA_4
atgttatgttgcgagtaa
>fixA_5
atgttgcgagtaaaaaaatag
>yabH_1
atgacaggtatgataatgcaaattataggcgatgtcccacaattgaccgcagccggaaaacggtaa
>yabH_2
atgtcccacaattga
>imp_1
atgccgtgcctaacaccactgacgctattcggacaggattaa
>imp_2
atgacgagtacgttagtctctgaccgtttgtcacgcgcaacgttaccgatgatggaacaataa
>araC_1
atggacaattggtttcttctctga
>araC_2
atggcgggagtatga

というように同じ名前のものでも、行ごとに名前を変えて
(1〜順に名前をつけていく)表示するにはどうしたらいいのでしょうか。
778デフォルトの名無しさん:04/08/30 19:08
>yabH_2
atgtcccacaattga
>imp_1
atgccgtgcctaacaccactgacgctattcggacaggattaa
>imp_2
atgacgagtacgttagtctctgaccgtttgtcacgcgcaacgttaccgatgatggaacaataa
>araC_1
atggacaattggtttcttctctga
>araC_2
atggcgggagtatga
というように同じ名前のものでも、行ごとに名前を変えて
(1〜順に名前をつけていく)表示するにはどうしたらいいのでしょうか。
779デフォルトの名無しさん:04/08/30 19:09
>>776
>>778
>>779です。
見にくいと思ったので続けて貼りました。
780758:04/08/30 19:16
orz
やっぱり-Cが"リサイクル"されてしまうほど
誰も使ってなかった機能なんでしょうか
my ($pre, $num);
while(<>){
  if(m/^>(\w+)/){
    $pre = $1;
    $num = 1;
  } else {
    print ">${pre}_$num\n";
    print ;
    $num++;
  }
}
>>779
本買って自分でやれ
783779:04/08/30 20:02
チッ
実践 バイオインフォマティクス -ゲノム研究のためのコンピュータスキル
http://www.amazon.co.jp/exec/obidos/ASIN/4873110688

こういう本買うとやりかた載ってンのかなあ?
本屋で見かけたことあるけど、立ち読みすらしたことないんで俺はわからんが。
785デフォルトの名無しさん:04/08/30 20:07
>>781
ありがとうございました。
本当に勉強になります。
>>782
はい、勉強します。
786779:04/08/30 20:35
783は自分ではありません。
プログラムを教えてくださる方々には本当に感謝しています。
でもあまり聞きすぎるのもあれなので、しばらく自分で勉強します。
また今度よろしくお願いします。
>>786
夏休みの宿題が間に合わないと諦めたらしい。

とかいう煽りでOK?
788デフォルトの名無しさん:04/08/30 23:31
print <<"END";
...
END

と終端文字列を記述すると何も表示されないのに、

print "...";
print <<"END";
...
END

とすると表示されます。(print"...";の内容は表示されません)
これは何故なんでしょうか??
[ test.pl ]
#!perl
print <<"END";
...
END
---------------------------------------
>test.pl
...


>perl -v

This is perl, v5.8.4 built for MSWin32-x86-multi-thread
790789:04/08/30 23:52
思いっきり的外してたorz..

確かにエラーになるね

Can't find string terminator "END" anywhere before EOF at D:\Lab\27\test.pl line3.
ENDという名前がまずいんだろうか・・・。
792デフォルトの名無しさん:04/08/31 00:20
わからん。
BEGINとENDはawkエミュやら-n/-pオプションなんかでも
使われる特殊な語なのでいかんのかも。
Perlにも BEGINブロックやらENDブロックやらがあるわけだが...

おまいら適当な事言い過ぎ
質問があります。

s/([^:])“/<k-70>$1<k\$>“/g;

s/”([^\n])/<k-70>”<k\$>$1/g;

というように後方参照させた場合、
日本語をマッチするときに文字化けします。
これはJPerlやJcodeなどを使わないといけないんでしょうか。
>>788-791
END の後に余分なスペースが入ってる。

ただしく実行できるよ。
>>795
うん、文字化けするね・・・。
Perl 5.8 なら、use utf8; で OK なんだけど。
>>795
文字の正規表現
http://www.din.or.jp/~ohzaki/perl.htm#Character

ここを見れ。日本語1文字ずつにマッチさせることも可能。
>>796
        ( ゚д゚)
        (| y |)

        (∩д∩)ゴシゴシ
         | y |

        (;゚д゚)
        (| y |)

        (∩д∩)ゴシゴシ
         | y |
          _, ._
        (;゚ Д゚) …?!
        (| y |)
>>799
どした? Perl 5.6 でも 5.8 でも正しく実行されますが。

a.pl
---
print <<"END";
...
END

perl a.pl
...

perl -cw a.pl
a.pl syntax OK

perl -v
This is perl, v5.6.1 built for i386-linux
perl -v
This is perl, v5.8.4 built for MSWin32-x86-multi-thread
801デフォルトの名無しさん:04/08/31 14:07
どこに空白が入っているというのか小一時間問いつめたい。
802デフォルトの名無しさん:04/08/31 14:13
> 0 23:31<dd>print <<"END";<br>...<br>END<br><br>と終端文字列を記述す

空白なんかない
803799:04/08/31 14:18
#!perl
print "...";
print <<"END";
...
END
↑ここに改行入れるとうまく動いた
>>801-802
書き方がまずかったようで。スマソ。

2ch に貼り付けられたコードじゃなくて、貼り付ける前の
コードのことです。
>>790 のようなエラーになるのは、
END
という行が見つからないということだから、ソース中に
そういう行がないという意味。

コードを見てみると正しく書かれているので、
質問者の環境でエラーが起こるということは、
空白文字(改行等)の関係では、と思ったわけです。
漏れは vi 使いで Emacs でも (setq require-final-newline t) してるので、
こりゃ絶対気づけないエラーだな。
806デフォルトの名無しさん:04/08/31 15:24
行頭の空白を除去する処理が必要なのですが、具体例として

while(<ARGV>) {
 s/^[\t\s]+//;
 print;
}

このようなスクリプトを想定した場合、
空行 (改行だけの行) を処理すると、改行コード(\n)まで消えてしまいます。
いちおう今は応急措置として、
s/^[\t\s]+(.*)\n/$1\n/;
のようにしていますが、なぜ改行まで消えてしまうのでしょうか?
807デフォルトの名無しさん:04/08/31 15:36
>>806
\sは、改行にもマッチするから
>>806
短く書くなら、\s をスペースにかえて、

s/^[\t ]+//;

でOKかな。
ちなみに、\s がマッチするのは、スペース、\t、\n の3つね。
ヒアドキュメントを使って次の用に記述したいのですがうまく出来ません。

if($flag==1){
 $text = <<"TEXT";
  XXXXXXXXXX
  YYYYYYYYYY
 TEXT
}else{
 $text = <<"TEXT";
  AAAAAAAA
  BBBBBBBBB
 TEXT
}
print $text;

諦めて次のようにすると実行できるのですが出力結果にタブが付加されてしまいます。

if($flag==1){
 $text = <<"TEXT";
  XXXXXXXXXX
  YYYYYYYYYY
TEXT
}else{
 $text = <<"TEXT";
  AAAAAAAA
  BBBBBBBBB
TEXT
}
print $text;

ソースコード内での可読性を維持しつつ出力に余分なタブを付けないようにすることはできないでしょうか?
できれば、ヒアドキュメントの終端にタブを使う方法はないでしょうか?
811デフォルトの名無しさん:04/08/31 16:29
open(IN,"<$datafile");
@lines = <IN>;
close(IN);

@linesをデータ加工

ファイルロック
ファイルの書き込み
ファイルロック解除っていうやり方はどこか問題ありますか?
ある
>>810
それ、ラクダ本やクックブックに載ってたな。。
>>811
1行目の $datafile と ファイル書き込みのファイルが同一ファイルなら、
最初の読み込みのところでもファイルロックしておくべし。
>>813
ラクダに載ってたっけ?どのあたりかな?
ちなみに俺はそんな場所でヒアドキュメント使うな派
>>809
\f もマッチするよ。
>>813
ラクダ本とクック本に載ってるんですね、情報ありがとうございます。調べてみます。

>>815
それはそうなんですけど、サブルーチンの中とかループの中に記述したくなるときとか多々あるんですよ、これが。
818デフォルトの名無しさん:04/08/31 17:10
MySQL + Perl
use DBI な状況で、

例えば
$sth = $dbh->prepare(
"INSERT INTO `sample1`(t1,t2,t3,t4,t5,t6,t7,t8,t9,t10) VALUES (?,?,?,?,?,?,?,?,?,?)"
);
で、row(s)の数は変化します。
(動的に prepare 内の command を生成しています)

$sth->execute
で配列を insert したいのですが、可能でしょうか?
Visual Perlの情報追加。
エディタ上で間違いを指摘してくれます。

$a = "abcdefg";
$a =~ s/a/A/;
$a ~= s/b/B/;
~~~~~~~~~~~~~~
print $a;

こんな感じに赤の波線で。
それDBの設計が間違ってますよ。
>>820
いえいえ、動的にrow(s)が変化するのはデータによって、入力テーブルも変化するためです。
>>810
ち、すでに終わってたか。
出所はクックブック。

sub hd($){
 my $text = shift;
 my($tab) = $text =~ /^(\t+)/;
 $text =~ s/^$tab//gm;
 $text;
}

if($flag==1){
 $text = hd<<" TEXT";
  XXXXXXXXXX
  YYYYYYYYYY
 TEXT
}else{
 $text = hd<<" TEXT";
  AAAAAAAAA
  BBBBBBBBB
 TEXT
}
print $text;
823818:04/08/31 18:26
>>818
ただいま本を買って読みました。bind_paramを誤解してました。簡単にできました。
>>809
\r もマッチするよ。
>>816 >>824
ハァ?
略記号  文字クラス    意味
\w     [a-zA-Z0-9_]   小文字、大文字のアルファベット、数字、下線
\W    [^a-zA-Z0-9_]   小文字、大文字のアルファベット、数字、下線以外
\s     [\r\t\n\f]     空白文字(復帰、タブ、改行、フォームフィールド)
\S     [^\r\t\n\f]     空白文字(復帰、タブ、改行、フォームフィールド)以外
\d     [0-9]         数字
\D     [^0-9]        数字以外

=糸冬=
http://www.kent-web.com/perl/chap7.html
\s スペース。[ \r\t\n\f] に同じ。
>>813 です。
s/ラクダ本や/ラクダ本か/
でした。。
>>822 の、サブルーチンでないやつもやったよね。
ヒアドキュメントの後に置換を書く方法の。
下は、今適当に考えたもの。

$_ = <<" END", s/^\t//gm;
 aa
 bb
 END
print $_;

結果:
aa
bb
>>829
こうすると$_に依存しなくなるね。

($doc = <<" END")=~s/^\t//gm;
 aa
 bb
 END
print $doc;
なんとなく、そこまでしてインデントしたいか?という気もしてこなくはなかったり。
ヒアドキュメントなんか面倒だからqq使ってるんだけど、
qqの場合はインデントはどうにかできないの?

if(1)
{
 print qq
 (
  あいうえお
  かきくけこ
  さしすせそ
 );
}
>>797
>>798

ありがとうございます。
早速試してみたいと思います。
>>833
>>822のサブルーチンを使えばいいんじゃないの。
その場合、"(" と ")" に続く空白と改行はいらないだろうから
こうすればいいんじゃない。

sub hd($){
 my $text = shift;
 $text =~ s/^[ \t]*\n//;
 $text =~ s/[ \t]+$//;
 my($tab) = $text =~ /^(\t+)/;
 $text =~ s/^$tab//gm;
 $text;
}

if(1)
{
 print hd qq
 (
  あいうえお
  かきくけこ
  さしすせそ
 );
}

PARで、複数のモジュールを含むには、どんな指定したらいいの?
>>837
You may specify -M multiple times.

とあるから、-M ... を必要な回数書けばOKかも。
839837:04/09/01 01:38
>>838
激しくありがとう
>>831
おお、なるほど。カンマも使用しないし、こっちの方がいいね。
841デフォルトの名無しさん:04/09/01 01:47
"漏れってバカ" =~ /バカ/;
はどうやったらマッチするの?
>>795, >>835

>>797 >>798 です。
せっかくなんで、もう少し詳しく書きます。

Perl で日本語を1文字ずつ処理するのは、ちょっとテクニックが
必要なんだよね。
自分が用いた方法は、

1. 文字コードを euc-jp に変換
2. euc の文字コードにマッチする正規表現を使って、1文字ずつ切り出し

というもの。(Shift_JIS でもできるかも)。

次の例では、$name に入っている文字列を、半角換算で30文字
(全部全角だと15文字)に切り詰めています。

# EUCの文字
my $c = "([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE])";

Jcode::convert(\$name, 'euc', 'sjis');
@_ = $name =~ /$c/g;   # 1文字ずつに分割
$name = join('', @_[0..14 + (join('', @_[0..14]) =~ tr/[\x00-\x7F]//)/2]);
Jcode::convert(\$name, 'sjis', 'euc');
続き

$name = の行が、1行に詰め込みすぎて見にくいんですけど、
全角・半角関係なく15文字に切り詰める処理なら

$name = join('', @_[0..14]);

で OK です。

日本語を正しく切り出すには、このように EUC 文字コードにマッチする
正規表現(ここでは $c に代入)を使って、. (ドット)等の代わりに
使うとよいですよ。


---
ちなみに自分のオリジナルのコードでは、上のコードの
@_ = $name ... の行は

@_ = $name =~ /([\x00-\x7F]|[\x8E\xA1-\xFE][\xA1-\xFE]|\x8F[\xA1-\xFE][\xA1-\xFE])/g;

となっていて、変数 $c を使わずにすませています。
>>841
それでマッチしてますよ。(マジレス。。)

print "漏れってバカ" =~ /バカ/;

結果:
1
if ("漏れってバカ" =~ /バカ/) {
  print "バカで悪かったナ(`ω´)";
}
>>814
読み込みから書き出しまでを1つのロックの中で実行しないと

Aが読み出し
Bが読み出し
Aが更新して書き込み
Bが更新して書き込み

という順序で実行される可能性があって、このときAが行った
更新が失われてしまう。
847デフォルトの名無しさん:04/09/01 13:58
flockを使ってファイルロックをする場合はファイルを読み出す前にファイルロックはできないんですか?

open(OUT,"+<test.dat");
@lines=<OUT>;#データの取り出し
flock(OUT,2);#ファイルロック
truncate(OUT,0);
seek(OUT,0,0);
push(@lines,"aaa\n");
print OUT "@lines";
close(OUT);

このようにファイルロックをするまえにopenしているんですけど
普通はファイルロックしてからopenするんじゃないんですか?
>>847
できるできないの前に意味あんの?
つーかflockのタイミングおかしいですよ!
flockはopenされた状態のファイルハンドルにしかできない。
openされていれば読み出す前にやるのは何の問題もない。

もっともロックするファイルと実際に読み書きを行う
ファイルが同じでなければならないということもない。

何のためにロックするのか、flockで何ができるのかと
いったことをもう一度勉強し直した方がいい気がする。
実際にデータを読み書きするファイルとは別に、
トランザクションロックするためだけのファイルを用意しといてそっちを flock する、
ってのはよくある手な気がするんですが、どうなんでしょうねえ。
851デフォルトの名無しさん:04/09/01 14:38
じゃあflock以外のファイルロック方法は普通はopenするまえにファイルロックするんですか?
初心者なんでスマソ
>>851
なにが普通かはつくりによるとしかいいようがない。

1つのファイルの内容を直接書き換えて更新し、ロックファイルを
別に用意しないで同じファイルですまそうとすれば、openした直後
にflockして読み出して更新という手順になるだろう。

ファイル更新中にシステムが落っこちると消えてしまうのを嫌って
新しい内容のファイルを別につくってできてから置き換えるという
ような構造だと、古い内容のファイル開く前に別にロックファイル
用意してそっちをflockしてからはじめるのが普通かな。

あるひとつのプロセスだけが、そのファイルを操作できるようにするという手もあるわな。
ひとはそれを「データベース」とよぶ・・・
排他処理
排他処理にはいろいろ方法があるからね。
正露丸でも詰めとけ>歯痛処理
今は糖衣錠ばっかじゃねーの
859851:04/09/02 01:38
すいません
排泄処理ってなんですか?
ふざけないんできちんと教えてください
>>859
>> 排泄
痔を間違えてるよ。俺もだけど。
【Perl】ファイルロック(排他処理)について語ろう
http://pc5.2ch.net/test/read.cgi/php/1024795138/
システムに頼む普通のflockが一番信頼性が高いのは言うまでも無いんですけどね
それでも怖いならDB使えや
【Perl】アァナルロック(排泄処理)について語ろう
>>860
読みも間違えてる気が…。釣り?
×ハイセツ → ○ハイタ
字が違えば読みも違うのはあたりまえじゃん・・・
866795:04/09/02 23:50
>>797 >>798

>>842 >>843で教えていただいた方法だと、
僕の環境ではエラーが出てしまいます。
幸い開発・実行ともにPerl5.8が使用出来るので、
>>797で示唆していただいたようにUTF-8を使ってみました。

#! /usr/local/bin/perl
use utf8;
use Encode;
binmode STDIN, ':encoding(shiftjis)';
my $buffer;
read STDIN, $buffer, $content_length;

while (<STDIN>) {

s/([^:])“/<k-70>$1<k\$>“/g;

s/”([^\n])/<k-70>”<k\$>$1/g;

binmode STDOUT, ":encoding(shiftjis)";

print;

}

これで問題なく処理できました。
ありがとうございました。
867753:04/09/03 05:31
>>754
>>755
遅レスですみません。どうもありがとうございます。短く書こうと思えば
ちゃんと書けるのですね・・・精進しますorz
Perl.NETについて語りませんか?
つーか、誰か使ってる人いない?
under construction, please check back soon.
>>868
語ってよ。
あんたのレスで使えそうだったら入れてみる。
>>868
どこで配ってるの?
>>871
ActiveState
>>868にPerl.NETのうんちくを書くコトを許可する!


ちなみに870じゃない>俺
【Perl.NETのウンチク】
Perl.NETはPerlのコードをC#のコードに変換するだけらしい。
C#もJavaも書けるからいいや
>>874
MSILじゃなくてC#のソースコード?
877デフォルトの名無しさん:04/09/04 17:21
MSILに決まってんじゃんか
あんたアフォでつか?
で?ってゆう
MSILに変換するんだったらPerl.NETに限った話じゃないじゃん
880デフォルトの名無しさん:04/09/04 20:12
CGI::Session3.95をCPANからダウンロードしてきて、
スクリプトに組み込んだのですが、下の様なエラーがでます。

Can't locate auto/CGI/Session/File/expire.al in @INC (@INC contains: ./lib c:/usr/lib c:/usr/site/lib .) at lib/CGI/Session.pm line 258

クッキーに保存したセッションIDをCGI::Sessionのnewメソッドに与えた時のみ起こります。
セッション生成時(第二引数がundefの時)には起こりません。

対処法ご存じの方、おられましたらアドバイスをお願いします。<(_ _)>
881880:04/09/04 21:16
>>1さんの書き込みも読まずに、CGIの質問をしてしまいました。
ご迷惑をおかけしました。
Webプログラミング板にいってきます。
realplayer 向けの *.lst file を作成するスクリプトを書いています。
下記の二行目において @music_file をファイルが作成された順に
sort したいのですが、何かよい方法はありますでしょうか?
( file がおいてある dir でsystem ( ls -l ) を実行してファイルと
日付のhash を作成し、日付から sort することを考えています。)

****************************************************************
opendir ( DIR, $Source_DIR ) || die "failed open dir";
@music_file = sort grep { -f "$Source_DIR/$_" } readdir( DIR );
closedir( DIR );

open( FILE, ">./$LIST_FILE" ) || die "failed open file";
foreach $music ( @music_file ) {
if ( $music =~ m/mp3$/ ) {
printf ( FILE "file://$Source_DIR/$music\n" );
}
}
close ( FILE );
****************************************************************
885882:04/09/05 00:58
>>883
>>884
超速攻レスありがとうございます。
勉強不足で申し訳ありません。
参考にさせて頂きます。
>>882
@music_file = sort { (stat($b))[9] <=> (stat($a))[9] } grep { -f "$Source_DIR/$_" } readdir( DIR );

若い順(昇順)なら、$b と $a を入れ替えればOK。
修正

@music_file = sort { (stat("$Source_DIR/$b"))[9] <=> (stat("$Source_DIR/$a"))[9] } grep { -f "$Source_DIR/$_" } readdir( DIR );

でした。
statの結果をキャッシュしてませんね
-10点
889886:04/09/05 06:29
はいよ・・・(-"-)

@music_file = map { $_->[1] } sort { $b->[0] <=> $a->[0] } map { [ (stat("$Source_DIR/$_"))[9], $_ ] } grep { -f "$Source_DIR/$_" } readdir( DIR );

こっちも、昇順なら $a, $b を入れ替えればOK。
890デフォルトの名無しさん:04/09/05 10:09
ある配列をランダムに並べ替える上手い方法ないですかね
>>891勉強になりました
893デフォルトの名無しさん:04/09/05 14:22
894デフォルトの名無しさん:04/09/05 17:43
ActivePerl-5.8.4.810-MSWin32-x86.msi を C\Perl にいれてみたのですが、
ppm install win32-api とコマンドプロンプトで打ってみても特に何か起こったような気配がありません。
'install' は内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。
とでてしまいます。
PathはC:\Perl\binに設定しているのですが、これがおかしいのでしょうか?
お願いします。
895882:04/09/05 18:32
>>886-889
大感謝です。ありがとうございます。
889 の記述の a と b を入れ換える事によって、作成日時の
古い順に sort できております。
今まさに、完成したスクリプトが出力したリストファイル
で、音楽を聞いております。
>>894
---^
dir c:\Perl >tmp.txt
dir c:\Perl\bin\ppm*.bat >>tmp.txt
path >>tmp.txt
---$
というバッチファイルをコピペでつくってコマンドプロンプトで
実行して結果tmp.txtの中身をここに晒してみ
まさか、msiファイルをC:\Perlにぶちこんだだけってのが
落ちじゃないだろな
897894:04/09/05 19:39
晒してみます。

ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は ******* です

c:\Perl のディレクトリ

2004/09/05 02:47 <DIR> .
2004/09/05 02:47 <DIR> ..
2004/09/05 02:50 <DIR> bin
2004/09/05 02:47 <DIR> eg
2004/09/05 02:47 <DIR> html
2004/09/05 02:50 <DIR> lib
2004/09/04 00:28 37,368 pod2htmd.tmp
2004/09/04 00:28 16,951 pod2htmi.tmp
2004/09/04 00:27 <DIR> site
2 個のファイル 54,319 バイト
7 個のディレクトリ 17,141,141,504 バイトの空き領域
ドライブ C のボリューム ラベルがありません。
ボリューム シリアル番号は ***** です

c:\Perl\bin のディレクトリ

2004/06/01 12:23 46,401 ppm.bat
2004/06/01 12:23 146,840 ppm3-bin.bat
2004/06/01 12:23 46,401 ppm3.bat
3 個のファイル 239,642 バイト
0 個のディレクトリ 17,142,194,176 バイトの空き領域
PATH=C:\Perl\bin\;C:\cygwin;C:\config.sys
898894:04/09/05 19:47
追記
ttp://www.ddsystems.info/ex/ex_cgi/1002.html
によると、ppmと打てば、
PPM interactive shell (2.2.0) - type \’help\’ for available commands.
PPM>
と出るようですが、自分の場合は、C:\Perl\bin で ppm とうっても何の反応もないです。
ppm install aaaa とか適当に打っても何にも返ってきません。
ppm がおかしいのでしょうか?
perl -v で確認したところ、一応Perlは正しくインストールされているみたいですが・・
899896:04/09/05 20:33
>>898
OSは?
コマンドプロントでsetを実行したときのcomspec(ComSpec)の値は?

Pathの中にC:\Cygwinが入ってるのが気になるね。俺はCygwinを
まともにいじったことが無いのでよう分からんけど(^^;
cygwinを入れていてシェルの設定が中途半端?
900894:04/09/05 20:52
OSは2000です。

cygwinのPathを消して、再起動してみました。

ComSpec=C:\WINNT\system32\cmd.exe とでました。

たびたびすいません。
よろしくお願いします。
>>900
インストールしたときにppm外してたりしないよな
902894:04/09/05 21:45
>>901
多分いれてるとおもうのですが。
ttp://www.dream-seed.com/server/perl.html
のとおりにやっています。

ppm.bat はあるのですが、どうも正しく動いてくれないみたいです。

もうだめかなぁ。
903デフォルトの名無しさん:04/09/05 22:02
>>902
>もうだめかなぁ。
泣きつけば助けてもらえると思ってる時点で助ける気無くすよ。
他は普通にできてるんだから、自分が何か間違ってる可能性が高いわけだ。
だったらもっと前向きに解決しようとするのが普通だろ。
多分じゃなくて、ちゃんと確認した結果を伝えてください。
最悪の一行だよね。ぶっちゃけ。
905894:04/09/05 22:09
>>902
はい、申し訳ないです。
アンインストールして入れてみたのですが、標準どおり入れています。
でもやっぱり動かないみたいです。。
906896:04/09/05 22:18
>>900
PATHにC:\WINNT\system32を追加しろや。
cmd.exeのあるディレクトリがPATHにないとststem()が動かないから。
て優香、なんでPATHにC:\WINNT\system32が入ってないんだ?
907894:04/09/05 22:28
>>906
すいません、おかげさまで解決できました。
そのPathが要ったようです。
長々と申し訳ありませんでした
ありがとうございました。
>>906
> て優香、なんでPATHにC:\WINNT\system32が入ってないんだ?
俺も気になる。これ入ってるのはシステム環境変数の方だろ。わざわざ消してんのか?
909デフォルトの名無しさん:04/09/06 07:25
バイナリファイルを生成したくて昨日からperl勉強してるんですが、
perlってバイナリデータを書き込みできるんですか?

例えばバイナリエディタで開いたときに 20 20 20 00 00 20 と表示されるように
ファイル書き込みしたいんですが、どうやっても 202020000020 という文字列
が出力されてしまいます。

binmode は、読み込みには関係あっても書き込みには関係なさそうです。
pack と uppack という関数もありましたが、これはプログラム内部での
変換に過ぎず、書き込み時に print を使うと結局は文字として出力されて
しまうようです。
>>909
printfで書き込んだら?
911909:04/09/06 07:45
>>910
printf も print と同じく文字列として書き込みが行われてしまいます。
例えば以下のようなプログラムを実行したときファイルに書き込まれるのは、
0x20 という1byteのバイナリデータではなく、20という2byteの文字列です。

open (OUT, "> test");
$a = 20;
printf OUT $a;
close (OUT);
syswriteでやるのはダメですか?
>>910
まず$aが16進のx20なら、$a=x20;だし、
printfは、フォーマットを指定しなきゃ意味ない。
Perl初心者ですがこんなの重いつきました。どうでしょうか。
vec関数については自分で調べてください。よく分らないので。
open(FH,">aaa.txt");
vec($a,0,8)=0x20;
syswrite(FH,$a);
close(FH);
915909:04/09/06 08:11
>>912>>914
おお、できました。vecとsyswriteを組み合わせるといいんですね。
ありがとうございました。

>>913
フォーマットを指定すると明示的に文字列変換が行われてしまうので、
よけい都合が悪いと思ったんです。0x20についてはその通りでした。
>>915
変換なしなら、\x20じゃなきゃ…。
917886:04/09/06 09:42
まあたしかに、Perlはバイナリの扱いはちょい苦手だね。
その分、テキスト処理でめっぽう強いのだけど。
名前残ってた。スマソ。
>>917
ぜんぜん苦手じゃないよ。おまいの技量が足りないだけ。
>>915
vecはちょっと用途が違うし、syswriteにいたっては無関係もいいとこだぞ。
普通はpackしてprintする。perl packでぐぐれ。

syswriteはいわばprintのバッファリングなし版。意味もわからず使うべきものではない。
>>917
Perlがバイナリの扱いが苦手だと思う点を述べよ

>>919
Perlがバイナリの扱いが苦手では無いと思う点を述べよ
>>921
>>920も出た時点で、
>Perlがバイナリの扱いが苦手では無いと思う点を述べよ
などとほざく理由を述べよ。前晒し:ぼくpack使えない。
>>920
packとprintを使ったサンプルきぼん
>>920
syswriteを使う場合は、アプリ側でバッファリングして、
書き出しのタイミングを自前で操作。
printの場合はseekでファイルポインタを移動させて書きこみ、
フラッシュのタイミングはPerl(Libc?)次第。

ということですよね。syswriteのようにファイルの任意のポイントを
指定して書き込む関数はprint系の関数にはないんでしょうか?
>>923
こんなんでどうでしょ
perl -e 'open(OUT,">tmp.txt");print OUT pack CCCC,0x50,0x65,0x72,0x7C'
>vecはちょっと用途が違うし

それではvecというのはどういう用途が正しいのでしょうか?
$a="abc";substr($a,1,1)="B";print$a
$a="abc";vec($a,1,8)=0x42;print$a
substrもvecも結局同じというみたいですね。
正規表現の練習の為に、簡単なコードを書いているのですが

$test = "プリンター";
$mach = "プリンター";
if($test =~ /$mach/){
print"あたり\n";
}else{
print"はずれ\n";
}

と書くと、エラーがでてしまいました。
if($test =~ /$mach/){
でエラーです。

どうしてだろうかと、いろいろやってみた結果、$machがプリンタだと
エラーが起きないのに対し、プリンターだとエラーになってしまうようです。

正規表現のトラブルとして検索したのですが"ー"ではヒットせずに
困っております。
この場合、どうすればよいのでしょうか?
アドバイスいただければ幸いです。
最新のperlをインスコしてうにこーど使う。きっとこれ1番。
>>911
バイナリ変換はココでもよめ。

ttp://www.mikeneko.ne.jp/~lab/perl/numerical_transform/
>>928
メタ文字が原因 /\Q$mach\E/ にしたらうごかねぇ?
931928:04/09/06 12:39
>>929
>>930

レスありがとうございます。
/\Q$mach\E/
これでいけました。
リンクさきも拝見させていただきます。
どうもありがとうございました。
932928:04/09/06 12:40
ぁぅ、違った。
リンク先は911さんへのレスでしたか。
「mach」のことは聞かないほうがいいのだろうか・・・
934927:04/09/06 13:05
substrの引数が「EXPRのOffsetバイト目から何バイトとnバイトの領域を指定」
という意味なのに対して、
vecの引数は「EXPRのビット長をアライメントとしたOffset番目」
という意味ですね。
似てるようでいてちょっと違いましたね。スマソ

>>933 こちらへどうぞ
http://pc5.2ch.net/test/read.cgi/unix/1005039977/
マッハジェットプリンタ
>>911
1byte のバイナリを出力するときは、chr でもOK。

print OUT chr($a);

1byte バイナリ→アスキー変換は ord 。
教えてください。2日悩みましたが分かりませんでした。
POPでCGIにクエリを投げて、responseを取得したいのですが、
下記のように書くと、$answer1、$answer2が全く同じものが返ってくるんです。
デバッガで見ると&POPに渡した変数は、ちゃんと$issnに入ってるのに、パケットを
拾って見たところ、全く同じrequestしてるんです。
$answer1 = POP("1234-5678");
$answer2 = POP("5678-1234");
この順番を逆にするとanswer2は上手くいって、answer1に2と同じものが入ります。
根本的なミスだろうとは思うんですが・・。

↓スクリプト
#!/usr/bin/perl
use LWP 5.64;
use URI;
use encoding 'utf8';
binmode(STDERR, ':raw :encoding(utf8)');
use Encode;

$answer1 = POP("1234-5678");
$answer2 = POP("5678-1234");

sub POP {
my $issn = @_[0];
my $browser = LWP::UserAgent -> new;
my $url = URI -> new('http://www-lib.ac.jp/Search');
my $response = $browser->post( $url,
[
db => "all",
isbn_issn => $issn,
submit => "Search",
],
);
$response = decode('shiftjis',$response->content);
return $response;
}
Perlのバージョンは?
>>939 5.81です。すいません。
そのモジュール使ったことないからよくわからんけど、
ちょっと思ったのは

\%hogehogeってのと\@hogehogeってのは等価なのかね? 一般論として。

つまり、 ['hoge', 'hoge', 'hoge', 'hoge']と
{'hoge' => 'hoge', 'hoge' => 'hoge'}は書き方は違うけど中身は一緒?

今日まで、んなこと気にしたことなかったケド。
942942:04/09/06 23:12
んなわけないか。

[ ... ]のとこを{ ... }にしたら動いたりしないかな。しないか。
943942:04/09/06 23:29
いまperldoc見たら [ ... ]でも{ ... }でもどっちでもいいって書いてあるね。
だからそれは関係ないな。
>>938
答えではないけど、、

use LWP 5.64;

use LWP::UserAgent;

],

]

にしてみたらどうでしょう? 関係ないかな。。
945937:04/09/07 00:32
>>937
文書中 POP -> POSTの間違えです。恥

>>941-944
レスありがとうございます。>>938は元のスクリプトが長いもんで、
適当に縮めて書き直しました。今風呂に入って見直してみたら、細かい
間違いがいっぱいありました。疲れ果ててました。すいません。
ただ気を取り直して、別のスクリプトを新しく書いてみたら、上手く逝ってしまいました。
元がどうして上手く逝かないかはまだわかりませんが・・。

↓一応実働します
946937:04/09/07 00:32
#!/usr/bin/perl
use LWP 5.64;
use URI;
use encoding 'utf8';
binmode(STDERR, ':raw :encoding(utf8)');
use Encode;

$answer1 = POST("200-0000"); #郵便番号を入れる
$answer2 = POST("100-0000"); #郵便番号を入れる

print $answer1."\n".$answer2;

sub POST {
my $zip = $_[0];
my $browser = LWP::UserAgent -> new;
my $url = URI -> new('http://search.post.japanpost.jp/7zip/zip2.cgi');
my $response = $browser->post( $url,
[
mode => "search",
start => "0",
end => "400",
keyword => $zip,
],
);
$response = decode('shiftjis',$response->content);
return $response;
}
>>941
全然別物ですから・・・

>今日まで、んなこと気にしたことなかったケド。
大丈夫かお前さん
きちんと症状が出てることを確認したプログラムを
打ち直さずにコピペしろってことで。
>>947
>>941 じゃないが、>>942 ですぐに気付いてるよ。
マターリいきましょ。

[...] は配列へのリファレンス、{...} はハッシュへの
リファレンスね。
リファレンスというか、無名配列と無名ハッシュでした。。
>>941
[]と{}は別物なんだけど、LWP::UserAgentのpostはどっちも
食えるように作ってあるという話ですな。普通は混同しては
いけない。

952ぬるぽ ◆GmgU93SCyE :04/09/07 14:19
名前の「GmgU93SCyE」は、どういうプログラム文で決めたものでつか?
953デフォルトの名無しさん:04/09/07 16:20
次の質問をどうぞ
>>952
おそらく、DES暗号あたりかな
>>952
「2ch」「トリップ」あたりでぐぐればいろいろでてくるよ。
perlならこのへんかな?

ttp://multix.jp/html/memo/030525.html#0002
>>952
DESてのが元々あり
平分←(鍵)→暗号文
と行き来できるもので(以下略
(XOR演算とかbitのローテーションとか)
Cryptは最初に固定の平分を暗号文にし、
その暗号文を繰り返し(以下略
(salt、patternとか)
トリップはそのcryptを利用しており
キーの2,3文字目をsaltと固定し、cryptの戻り値の末尾10文字を(以下略
($trip = substr(crypt($key, (substr($key."H.", 1, 2))), -10);とか)

適当、半分くらいは当たってるはずだ。ガッはしてあげません。
957ぬるぽ ◆GmgU93SCyE :04/09/07 17:11
ありがと
PHPでオナジことできればいいのになぁ・・・
できるだろ・・・。
959ぬるぽ ◆GmgU93SCyE :04/09/07 17:39
2chとまったくオナジ変換ね
>>959
スレタイ読め
もしくはphp cryptで検索くらいしろ。
961デフォルトの名無しさん:04/09/07 18:52
質問です。
perlの処理で、”Enterキーを押す”っていう操作は
perlでは、どう記述するのでしょうか?
ご存知の方是非教えて頂きたいのですが?


$key = <STDIN>;
if($key eq "\r\n" or $key eq "\n" or $key eq "\r"){print 'Enterキター';}

print "\n"
とか
>>961
EnterキーとReturnキーは区別するの?
961です。
>>962さん
ありがとうございます!
この処理で2日間悩んでました。
助かりました。
ちなみに、>>963の改行はやったんですが、うまくいかなくて・・・
966937:04/09/07 20:46
スレ汚しすいません。
昨日上手く逝ったはずのスクリプトですが、実際動かすとやっぱダメでした。

http://www.perldoc.com/perl5.8.0/lib/LWP/UserAgent.html
によると$ua->post($url, \%formref, Header => Value,...);とあり
>>951さんの言う通りLWP::UserAgentのpostはどっちも食えるようです。

んで、分かりにくかったので、ハッシュに代入、ハッシュのリファレンスを入れました。
コレでも駄目だったんですが、>>946の郵便局のURLと郵便局のフォームのペアを入れ
ると上手く逝きます。じゃあ、CGIが駄目なのかと思い、Etherealでパケットをみると
同じパケットを送っています。元は、図書館のCGIから論文を探してくるスクリプトです。
わけわからんです。

↓スクリプト
967937:04/09/07 20:49
#!/usr/bin/perl
use LWP 5.64;
use URI;
use encoding 'utf8';
binmode(STDERR, ':raw :encoding(utf8)');
use Encode;

Tosho("issncode1");
Tosho("issncode2");
sub Tosho {
%form = (
db => "all",
wa => "w",
yo => "y",
lib_cd => "00",
isbn_issn => $_[0],
search_type => "Detail",
);
print $_[0];#変数も渡っていて
print $form{isbn_issn};#ちゃんとハッシュにも入っている
print "\n\n";
my $browser = LWP::UserAgent -> new;
my $url = URI -> new('http://www.lib.ac.jp/Scripts/WebOpac.dll/Search');
my $response = $browser->post( $url,\%form);
my $response = decode('shiftjis',$response->content);
print $response;#なのにresponseが同じ・・
print "\n";
}
情けない質問で申し訳ないですが…。
不特定の変数名などに「なんたらかんたら」とか
「ほにゃらら」みたいな感じで'foo'と'hoge'が使われますよね?
あれの意味とか起源って、なんですか?
hogeは、日本限定とか?知ってる方、教えて下さい。
970968:04/09/07 22:29
>>969
大変勉強になりました。ありがとうございます。

上記HPでは、否定されてますが、fooは「ほげ」の英語版って
ことで大雑把にはokですか?
>>967

「\」を「\」に置換した上で
URLを差し替えて試してみたら正常に動きましたけど。
(Redhat上のPerl5.8.0)

そこ以外のどこかがおかしいんじゃないの
>>959
DES はアルゴリズムが公開されているので、
どの言語でも実装できますよ。

--
次スレよろです
クソわがままな話ですが任意の特定のスコープ内だけブールの定義を変える方法存在しますか?
たとえば負の数値は全て偽、みたいな?

こーゆーのがあると記述がサッパリして見やすいなとか思っただけなんで、
ないんならそれでおkです。
>>974
演算子のオーバーライド
976
>>975 arigeter
>>966
>同じパケットを送っています
つーのはリクエストが同じってこと?
同じリクエストならこの場合は同じレスポンスが返るだろうけど
リクエストが同じなのかレスポンスが同じなのかはっきりしてちょんまげ

あとここではバックスラッシュを \ で書いても無問題だと思うよ
>>977
arigatorだろ。正しい英語を使いませう
それを言うならalligator(自己レスorz)
お、次スレ
Perlについての質問箱 12箱目
http://pc5.2ch.net/test/read.cgi/tech/1094579428/

おつんつん