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

このエントリーをはてなブックマークに追加
"The duct tape of the Internet"こと、
Perlについての質問箱です
"There's more than one way to do it"ということで
ぱぁるの奥深さについて皆で語り合い、追求してまいりましょう。

CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc5.2ch.net/php/ )

CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
WEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。

姉妹スレッド
http://pc5.2ch.net/test/read.cgi/php/1089779036/

過去ログは>>2-1001あたり
[プログラミング自体の経験が無い奴はまずココを読め]
Perlプログラミング講座: http://www5a.biglobe.ne.jp/~n_rieko/perl/

[本]
リャマ: http://www.oreilly.co.jp/BOOK/lperl3/
駱駝: http://www.oreilly.co.jp/BOOK/pperl3v1/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/BOOK/pcook/

[オンラインマニュアル]
Perldoc.com: http://www.perldoc.com/
perldoc.jp: http://www.perldoc.jp/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/%7ekbk/perl5.005/

[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://member.nifty.ne.jp/hippo2000/

[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
>>1
スレ立て乙。
そしてPerlスレ11箱達成おめ。
  ∧_∧
 ( ´∀`) < Parrot
6デフォルトの名無しさん:04/07/27 10:32
***.plって形でローカルに作成し、ActivePerlでそれを実行することでサーバにFTPアクセスしてファイルをダウンロードしてくるまでの一連の処理を作りたいのですがよくわかりません。ご教授願います。
7デフォルトの名無しさん:04/07/27 10:40
>>6
Windows版のwgetがあったと思うので、それをsystemを使って呼ぶ。
8デフォルトの名無しさん:04/07/27 11:43
二次元の連想配列を、値でソートしながらforeachで
出力させたいのですが、うまくいきません。

二次元連想配列を %data として、以下のような感じに書いています。

foreach $value (sort {ソート条件} values(%data)) {
  〜;
}

ここでソート条件の部分で$a、$bを調べると、ハッシュに
なっているので、ソート条件を

%$a{'aaa'} <=> %$b{'aaa'}

のように書くことでうまくいくのではないかなと思ったのですが、
エラーになってしまいます。

どのように書けばよいのでしょうか。

環境は Windows2000、ActivePerl 5.6.1 です。
よろしくお願いします。

9デフォルトの名無しさん:04/07/27 11:46
>8
すいません。書き込んだ直後に自己解決しました。

%$a{'aaa'} ではなくて、$$a{'aaa'} でした。
10デフォルトの名無しさん:04/07/27 14:57
>>6
Net::FTP 使え
11デフォルトの名無しさん:04/07/27 15:49
>>10

Net:FTP使ってみました。
------
use Net::FTP;

my $ftp = Net::FTP->new($server, Debug => 1);
$ftp->login($user, $pass);
$ftp->cwd($dir);
$ftp->get($file);
$ftp->quit;
------

こんな感じで使ってみると、指定ディレクトリ($dir)以下にある指定ファイル($file)はダウンロードできましたが、
これだと、指定ファイルのみダウンロードになってしまいます。
どーにかして指定ディレクトリ毎落とすことはできないのでしょうか?
12デフォルトの名無しさん:04/07/27 15:54
教えて君ですか・・・
>>13
そこまでわかってたらあとはファイルのリストをとって
ぐるぐるループすりゃいいだけだろ。
14デフォルトの名無しさん:04/07/27 16:03
>>13
どーすればファイルのリストをとれるのでしょうか?
そのくらいNet::FTPのマニュアル嫁。
16デフォルトの名無しさん:04/07/27 17:02
どーやったらマニュアルを読めるのでしょうか?
>>16
マニュアル読まずにどうやって >>11 のコード書いたの?
18デフォルトの名無しさん:04/07/27 17:21
>>17
>>16は私ではありません。
Net::FTP 教えてやったんだから後は自分で頑張れ
20デフォルトの名無しさん:04/07/27 17:27
>>18 も私ではありません。
21デフォルトの名無しさん:04/07/27 17:52
なんかすごいヤツがいるな。
Perl用のWeb系フレームワークと、それ用の開発環境って無いですか?
>>22
開発環境は知らんがフレームワークなら http://sl.edge.jp/
それと Web 系の話題は WebPlog 板へ。
24デフォルトの名無しさん:04/07/27 20:10
sub func {
  my(*x1, *x2) = @_;
}

ってダメなの?
25デフォルトの名無しさん:04/07/27 20:23
Perlの関数名って大文字から始まるのと小文字から始まるの
どちらが普通?
27デフォルトの名無しさん:04/07/27 21:48
26はあぼーん推奨
28デフォルトの名無しさん:04/07/27 21:50
>27
え?どうしてですか?
>>27
何故?
30デフォルトの名無しさん:04/07/27 23:25
ファイルを読み込んで処理を行い,保存したいのですが
以下のような感じでやってもうまくできません.

open FILE, "+>$filename";
@array = <FILE>;
foreach $tmp (@array){
処理
}
print FILE @array;
close FILE;

@arrayをプリントしてみたところ配列にファイルの内容が読み込まれてないようです.
31デフォルトの名無しさん:04/07/27 23:32
>>30
open FILE, "$filename";
32デフォルトの名無しさん:04/07/27 23:35
>>30
open( FILE, "+>$filename" ) or die $!;
 と、してみたら?
ドキュメントの該当箇所探すの面倒なので今後はこのスレに丸投げすることにしよう。
こりゃ楽だわ。
>>31-32
レスありがとうございます.
できませんでしたorz
31さんの方ですと$arrayに読み込むことができるのですが
ファイルに書き込み(上書き)することができませんでした.
32さんの方では30の時と結果変わらずでした.
ちなみにこんな感じでテストプログラム作りました.

$filename = "test.txt";
$tmp = "hoge\n";

open (FILE,"+>$filename")or die $!;
@array = <FILE>;
push @array,$tmp;
print FILE @array;
close FILE;
36デフォルトの名無しさん:04/07/28 00:31
ttp://take4.dynsite.net/mt/archives/000020.html
ttp://www.ken3.org/cgi-bin/group/vba_ie.asp

上記のページを参考に、Windows上でIEを操作して業務アプリ用の
フォーム自動入力をやらせようとしてます。
ところが、中にいちいちJavascriptで確認を求めるポップアップが
出てくるページがあり、対応に苦慮しています。
アプリのほかの部分で使っているため、
IEの初期設定でJavascriptを切る方法は使えません。

そこで下記のようなアプローチをしていますが、うまく行きません。
お知恵をお貸しくださいますでしょうか。

○ポップアップ機能「だけ」を殺す
http://msdn.microsoft.com/workshop/browser/webbrowser/reference/properties/silent.asp
○Win32::GuiTestでEnterキーを入力
(SendKeysでうまくいかなかった例)
--------------------------------------------------
use Win32::IE::Mechanize;
use Win32::GuiTest qw(SendKeys);

my $ie = Win32::IE::Mechanize->new( visible => 1 );

$ie->get('http://hoge.com/'); #ポップアップが出てくるページ
SendKeys("{ENTER}");
>>30-32 >>35
OSはUNIX系?それともWindows系?
後者はopenに失敗することがあるような。
>>37
windowsでactive perl5.8使ってます。
>>38
うろ覚えだがwindows(NT)+ActivePerl(バージョン失念)のとき
+>$filename
ではopen出来なかったような・・・
>>39
ソウナノカー(;´Д`)
ありがとうございました.
別の方法でやってみます.
41デフォルトの名無しさん:04/07/28 08:14
CGIからファイルを読むだけでもロックって
必要ですか?
はい。perlには関係ありません。
CGI?スレ違いだよ。
でもおそらくCGIとも関係ないです。

実装するアルゴリズムを自分のなかで整理してから、
どーすれば安全なようになるのか考えて下さい。
43デフォルトの名無しさん:04/07/28 08:38
読み込み中は書き込みをブロック(読み込みはOK)
44デフォルトの名無しさん:04/07/28 08:46
>>42
いや、あなたには聞いてないんですが・・・
45デフォルトの名無しさん:04/07/28 08:48
>>30
+>は読み書きできるようにopenするが、まず最初に>と同様
ファイルを空にするので何も読めないのは当たり前。

+<を使い、適切にseekやtruncateする必要もあるだろう。
>>44 聞いてないならハナから質問すんな
わざわざスレ違いをおしてまで答えたのになんだそりゃ。
まぁ二つも回答が書いてあるんだからもう二度とくんなよ。
47デフォルトの名無しさん:04/07/28 10:09
>46

いやいや、あなたには聞いてないというだけで、
他の人には聞いてました。
48デフォルトの名無しさん:04/07/28 10:10
テキストファイルから1行ずつ読み込んで、
末尾の改行を削除するために、以下のように
書いたのですが、えらく時間がかかります。

while ($line = <IN>) {
  $line =~ s/[\r\n]*$//;
}

もっと高速な書き方はあるでしょうか?
>>48
chompは?
50デフォルトの名無しさん:04/07/28 10:13
>49
すいません。昨日実験したときchompでも変わらなかった
気がしたのですが、今やってみたらえらく速く
なりました。ありがとうございます。
chomp()すれば?
52デフォルトの名無しさん:04/07/28 10:24
>>51
だからしたっつってんだろうがボケ!
>>52
chompでどう?
chompもいいと思うよ
>>48
ついでだけどその記述、一行づつ読み取ってるのにその正規表現は無意味だにょ。
/(\r\n)$/ でいいような。
5655:04/07/28 11:00
ごめんなさい。すごいボケてました。忘れてください。
57デフォルトの名無しさん:04/07/28 11:04
chomp には問題がある!!
じゃあ,chop
2バイトの改行だったらどうするんだ。chop君
60じゃあこうしよう:04/07/28 11:13
s/\x0D\x0A|\x0D|\x0A//g;
trのほうが速い
tr/\x0D\x0A//d
これは漏れの勘なんだが、ここ最近の質問は全部同じ質問者だったりして?
略して丸投げ
63デフォルトの名無しさん:04/07/28 11:37
例えばどれ?
64デフォルトの名無しさん:04/07/28 11:38
>>62
知ったかぶって答えるやつがいるからそうなるんだろうが。
65デフォルトの名無しさん:04/07/28 11:39
>>63
ここ最近と言っているんだから、少なくともこのスレッドでの質問全てでは。
66デフォルトの名無しさん:04/07/28 11:39
>61
実測した?
67デフォルトの名無しさん:04/07/28 11:40
>>64
まったくもって意味不明ですね。
では、知ったかぶっているのではなく「実際に知っている」人が回答したら
どうなっていたというのでしょう? :-P
68デフォルトの名無しさん:04/07/28 11:40
改行の質問したものですが、FTPは私じゃないです。
69デフォルトの名無しさん:04/07/28 11:40
>>68
というか他の質問も私じゃないです。
7062:04/07/28 11:48
>>64 だれに言ってるんだろ?
まー俺的には質問連打けっこーだけど。(てかただの勘だよ)

つーかレスはえーな。w
71デフォルトの名無しさん:04/07/28 12:14
>64は>62に対して言ってます。
読めば分かると思いますが?
>>70
質問がなきゃスレの意味がないし、答えたくなければスレを見なけりゃ
いいだけの話。
丸投げがあろうとなかろうと関係ないし、例のftpの質問への対応を
見れば度を越せば叱られるわけで、このまま普通にやってりゃ問題は
ない。

丸投げだ何だと書いた奴の目的は「質問スレに質問が来ないようにし
てスレを衰退させること」だろ。その手に乗るなよ。
73デフォルトの名無しさん:04/07/28 12:59
どのレベルまで調べて質問したって、もっと調べろとか
言ってくる奴はいるんだよね。

逆にこんなとこに常駐してるヤツはそんな難しい質問には
答えられないんだから、今のくらいがちょうどいいんだよ。
74デフォルトの名無しさん:04/07/28 13:00
>>71
あなた読解力ないですね ;-)
75デフォルトの名無しさん:04/07/28 13:01
>>73
> どのレベルまで調べて質問したって、もっと調べろとか
> 言ってくる奴はいるんだよね。
だから何なのかが不明瞭ですね。
何かができないこと、あるいは何かをしでかすことに対する
言い訳とか予防線のたぐいですか?
7630:04/07/28 13:04
>>45
レスありがとう。
勉強になりました。
77デフォルトの名無しさん:04/07/28 13:04
>75
そうだけど?何か?
78デフォルトの名無しさん:04/07/28 13:08
そもそもこのスレってどういう人種がいるんだ?
職業プログラマだったらここには来ないよな。
情報系の大学生、高校生あたり?
79デフォルトの名無しさん:04/07/28 13:26
データファイルの更新方法についてなんですが、
 use POSIX;
 use Fcntl qw/:flock/;
 open my $fh, "+< $file" or die $!;
 flock $fh, LOCK_EX;
 my @data = <$fh>;
 # @dataの内容を加工
 truncate $fh, 0;
 seek $fh, 0, SEEK_SET;
 print $fh @data;
 close $fh;
という方法だと、truncate〜printの間にシグナルなどで死んだ時に
データが消えてしまいます。(実際にありました。)
そこで次のように変えることで、自分では対処できたと思っているのですが、
何か見落としなどはありますでしょうか?(今のところ正常に動いてはいます。)
 use File::Temp qw/tempfile/;
 # use POSIX〜@dataの加工まで同じ
 my ($tfh, $tfile) = tempfile(DIR=>$tmpdir);
 print $tfh @data;
 close $tfh;
 rename $tfile=>$file;
 close $fh;
>>48
環境にもよると思うけど、漏れの測ったところでは、これが速かった。
$line =~ s/\n\z//; $line =~ s/\r\z//;
>>79
# 別途ロックファイルを用意してロック
open LOCK, '>' . $lock_file or die $!;
flock LOCK, LOCK_EX;
{
  # 適宜シグナルを書き換え
  local $SIG{'TERM'} = 'IGNORE';

  open OLD, '<' . $data_file or die $!;
  open NEW, '>' . $temp_file or die $!;

  # 加工と書き出し
  my @data = <OLD>;
  ...
  print NEW @data;

  close NEW; # flush
  close OLD;

  rename $temp_file => $data_file or die $!;
}
close LOCK; # 解除
>>79
以下のようなときにだめになる。

Aがロックして処理開始。
Bが来る。flockで待たされる。
Aがロック解放。
Bがflock抜け処理開始。しかしロックされたのはrenameで消えた方のファイルだし、読みこみも更新前の内容。
Cが来る。新しいファイルにはロックかかってないのでそのままflock成功。

対策はロックファイル別に用意するに
俺も一票。
単一プロセスだと思うけれども、、、
cron で動かしているのなら、 pid ファイルでも作って重複しないようにしなきゃかもですね。
svscan のほうが個人的には好きだけれども。
8479:04/07/28 16:20
>>81-82
テストしてみたら、82さんの言う通りでした。
81さんが示してくれた方法でやるようにします。
どうもありがとうございました。
85デフォルトの名無しさん:04/07/29 09:46
Win2k+ActivePerl環境で日本語を使用してグラフを作成したいのですが、(全角も半角文字も)文字化けして上手く表示されません。
どなたか、解決法をご存じでしたら、教えて下さい。

■環境
Win2k SP4
AvtivePerl v5.6.1 build 633
GD v2.15
GDGraph v1.43
GDTextUtil v0.86
Jcode v0.87
8685:04/07/29 09:51
ソースは http://www.gadgety.net/shin/tips/unix/perl-gd.html からほぼ丸写しです。
カレントディレクトリに HGRSKP.TTF をコピー済です。

use strict;
use Jcode;
use GD::Graph::bars;
my @labels = qw( under 10s 20s 30s 40s 50s 60s 70s over );
my @dataset = qw( 20 40 60 80 65 15 10 20 5 );
my @data = ( \@labels, \@dataset);
my $graph = GD::Graph::bars->new( 400, 300 );
$graph->set( title => jcode("にこにこ村の人口")->utf8,
y_label => jcode("人数")->utf8 );
GD::Text->font_path( "./" );
$graph->set_title_font( "HGRSKP", 14 );
$graph->set_legend_font( "HGRSKP", 8 );
$graph->set_x_axis_font( "HGRSKP", 8 );
$graph->set_x_label_font( "HGRSKP", 10 );
$graph->set_y_axis_font( "HGRSKP", 8 );
$graph->set_y_label_font( "HGRSKP", 8 );
my $image = $graph->plot( \@data );
open( OUT, "> graph.jpg") or die( "Cannot open file: graph.jpg" );
binmode OUT;
print OUT $image->jpeg();
close OUT;
87デフォルトの名無しさん:04/07/29 10:40
>>85
Perlのバージョンを5.8.5にする。
IPC::Open2を使ってデータのやり取りを繰り返したいのですが
どうもうまくいきません。

#------ test_pipe.pl
use IPC::Open2;

my ($WTR, $RDR);
my $pid = IPC::Open2::open2($RDR, $WTR, "./test_pipe2.pl");
while (<>) {
print $WTR $_;
my $line = <$RDR>;
print STDERR "$line";
}

#------ test_pipe2.pl
printf "%d\n", $_ + 10 while (<>);

データを送るたびにopenとcloseを繰り返すようにするとうまくいったのですが、
test_pipe2.plはいずれ起動に時間のかかるプログラムと入れ替えるので
一度だけのopenで済ませたいです。
どうすれば良いのでしょうか。
89デフォルトの名無しさん:04/07/29 17:32
ファイルの出力において、ファイル名を変数から決めたいのですが、
例えば
$number = 111111;
$writefile = "$number.txt";
とすると
$writefileが".txt11"となります。
また
$writefile = $number . '.txt'でも同じです。
どなた様がお分かりのかたおられるでしょか?
>>88
たぶんバッファリング問題によるよくあるデッドロックじゃないかと。
test_pipe2.plの最初で、$|=1すると改善するかもしれない。
9188:04/07/29 17:41
>>90
動くようになりました!ありがとうございます。
これでやっと作業を先に進められます。
9289:04/07/29 17:46
すみませんちょっと違いました。

テキストファイルに
111111
という文字列があり
$number = <INPUTFILE>;
chomp($number);
$writefile = "$number.txt";
とすると
$writefileが".txt11"となります。
>>92
全然違うだろ
>>92
再現する最小のコードを貼ってみないかい?
改行コードが入ってるか、
printしたときに2行が1行に上書きされているか、
だと思う
\r に1票
>>95-96 の補足。

>>94
UNIX 系 OS 上で

#!/usr/local/bin/perl
my $num = "111111\x0D\x0A"; # CR/LF
chomp $num; # LF を削除
my $str = $num . '.txt'; # 111111\x0D.txt
print $str, "\n"; # .txt11
__END__

>>89
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Remove
加算結果の数値が33ビット以上になった場合、答えが
強制的に0xFFFFFFFFになるのは仕様でしょうか…?
オーバーフローした分は切り捨てたいので
0xffffffffでandしてみたんですが、どうもうまくいきません。

$val1 = 0xC5943301
$val2 = 0x902F1AD0
$val3 = ($val1 + $val2) & 0xffffffff # 0x55C34DD1としたいのに…

この時、$val3は0xFFFFFFFFになってしまいます
99デフォルトの名無しさん:04/07/30 00:53
>>98
ありゃ、本当だ。どうしてそうなるかはオレもよくわからんが、
use integerすればお望みの結果になるようだ。


>>99
そ、そんなモジュールが・・・

Cみたいにlongとかが出来ないので四苦八苦してました_| ̄|○
おかげさまで出来るようになりました。有難うございます
101デフォルトの名無しさん:04/07/30 01:01
perlの擬似乱数に周期性があることを発見しました。2147483648周期と思われます。
処理系で異なるのかも知れませんが、この場合は乱数ジェネレーターが
32ビットで処理しているからだからだと思います。
これは2ちゃんねるのトリップを生成するプログラムを実行中に気づきました。

別に発見して嬉しいわけではなくて、周期性があっては困るので何とかしたいのです。
どうすればこの周期性を回避して乱数を発生させることが出来るのでしょうか?
不定期に初期化する
103デフォルトの名無しさん:04/07/30 01:31
>>102
それはどうすればいいのでしょうか?
割り込み処理でもしない限り難しいと思うのですが・・・。
10585:04/07/30 01:40
>>87
遅くなりましたが、なんとか上手くいきました。
どうも有り難うございました。
>>104
srandを使うかライブラリを使うしかないんですね・・・。
それで試してみます。ありがとうございました。
Perl6マダー?
108デフォルトの名無しさん:04/07/30 02:43
5.8でなにが問題なの?
109デフォルトの名無しさん:04/07/30 08:31
perlでゲーム画面のキャプチャを考えてます
10秒ごとにキャプってファイルに保存
キャプチャも画面全体ではなく、ある一部分のみキャプチャです
これを数回繰り返すものを考えています
DirectX使っていると思うのでどうすればいいのかわかりません

どなたかご教授お願いします m(_ _)m
>>109
perlでやる意味がわかりません。
111デフォルトの名無しさん:04/07/30 09:05
>>110
あなたには聞いていません m(_ _)m
112109:04/07/30 09:16
>>111
うは、あんた誰よ?

>>110
現在、フリーのキャプチャソフト使ってやっているのですが
キャプ後編集するという作業が面倒なので
自動化できないかな?と思った次第です
113デフォルトの名無しさん:04/07/30 09:18
>>109
10秒ごとにキャプチャーソフトをsystemで呼ぶ。
114デフォルトの名無しさん:04/07/30 10:39
@motoから@kesitaiを削除し、@nokoriを作りたいのですが、
loopを回す以外にスマートな方法は無いでしょうか?

魔法使いの皆様方、ご教示を。
>>114
my @moto = 1..10;
my @kesitai = (1,3,5,7,9);
my @nokori;
my %check;
@check{@kesitai}=(1)x@kesitai;
@nokori = grep !$check{$_},@moto;
>>114
perlクックブックのサンプルだとloop回してるなぁ。
だが、十分スマートに思える。
117109:04/07/30 12:12
>>113
ただ単純に一定時間ごとにキャプするなら(全画面)
今使ってるソフトでもできます(^^;)
肝心な点は、編集を自動化することなんです
でそのためには画像キャプ→編集→ファイル保存
という流れを自動化する必要があるということなんです
編集する位置、大きさがまちまちなんで・・・

やっぱ手作業ですかね・・・?
>>117
どういった編集かわからんけど、
編集する位置と大きさが分かるのなら
imagemagick + perlmagickで出来そうだけど。
119名無し募集中。。。:04/07/30 13:08
>>117
>編集する位置、大きさ
これ次第でPerlで出来るか出来ないか決まると思うんだが
この判定基準を詳しく書きなよ
120109:04/07/30 13:41
>>118 >>119
すみません。編集というよりトリミングです。
例えば、1024×768の画面をキャプチャしてから
開始位置10,10から20×15を抜き出す
というような処理を全て位置指定して一定時間ごとに
抜き出して保存したいだけです。形式はビットマップで。
一番いいのは先の例だと開始10,10から20×15の範囲を
キャプチャして保存というのが理想ですかね。

正直なところPerlよくわかりません。
なんかこれ用にexeをつくらないとダメとかならお手上げなのですが。
121118:04/07/30 13:58
サイズを指定してキャプチャするよりも、
フルサイズでキャプってからトリミングのほうが簡単なような...
位置&サイズは画像毎に異なるのですか?それはどうすれば取得できる?

位置&サイズさえ取得できればそれほど難しくないような...
122118:04/07/30 14:09
一定時間毎にキャプチャは既存ソフトで出来るのなら、
トリミング工程だけを自動化すればいいわけか...
なぜPerlをご指名なのか分からんけど、位置&サイズが全部同じなら
Imagemagickのconvertコマンドかmogrifyコマンドのcropオプションでなんとかなりそう。
トリミングする位置とサイズが
絵柄を見ないと判断できないなら自動化は多分無理

キャプチャーソフトが外部から操作するAPIを持っていて
かつPerlがそのAPIへのインターフェースを持っていなければ
多分無理

JPGに保存してからImageMagickとかで処理するという手もある
>>109
一定間隔ってのが0.1秒とかだと話はかわりそうだな。
ついでにその記録時間が半永久でなく、HDDの容量が許せばマクロとかバッチ処理が可能なツール使ったりもできるな。

>正直なところPerlよくわかりません。
>なんかこれ用にexeをつくらないとダメとかならお手上げなのですが。
PerlでやるよりVBでキャプチャツール作る方が簡単かも。
125109:04/07/30 15:08
ImageMagickすか。よくわからんですけど
ググって来ます。皆さんありがとうございました。
126デフォルトの名無しさん:04/07/30 17:14
カレントディレクトリを取得しようとして
use Cwd;
$dir = getcwd;
としたのですが、パスの区切りが/になってしまいます。
私はwindowsなので\に変換したくて
ttp://www5a.biglobe.ne.jp/~n_rieko/perl/8.htm
等をお手本にさせていただきながら
$dir = ~s/\//\\/g;
としたのですが上手くいきません。
数字の羅列がでてしまいます。

う〜ん・・よろしければアドバイスお願いできないでしょうか。
「= ~」 じゃなくて 「=~」な
128126:04/07/30 17:28
ぁ・・
ありがとうございました!!!
129名無し募集中。。。:04/07/31 05:34
>>109
いやだから
>開始位置10,10から20×15を抜き出す
>というような処理を全て位置指定して
この位置指定は何で決めるわけ?絵柄?その他の条件?
それ言ってくれないとPerlでできるできないは助言できんのだが

>>123の言うように絵柄でトリミング範囲が決まるならまず無理です
範囲が決まれば誰にでもできる程度
取込んだファイルを、Photoshopのアクションで自動化しろと
思うのは、俺だけですか?
Imagemagickでもいいけど、スクリプト書かなくちゃいけないでそ?
131デフォルトの名無しさん:04/08/01 15:52
文字列置換したいのですが、以下の1行が間違ってるみたいで動きません・・
どこが悪いんでしょうか

$_[0] = s/[;`'\\"|*?~^()\[\]{}$]//g;
~
133デフォルトの名無しさん:04/08/01 16:09
>>132さん

え??・・・・
134デフォルトの名無しさん:04/08/01 16:10
>>131
どういう結果を期待されているのか分からないため
答えれません
135デフォルトの名無しさん:04/08/01 16:16
例えば、

あいう;えお →あいうえお
あいう*えお →あいうえお

です・・・答えになってますでしょうか?
136デフォルトの名無しさん:04/08/01 16:17
=~
137デフォルトの名無しさん:04/08/01 16:29
すみません tr で、上手くいきました・・・
どういうわけか、=~ だめでした。スペースも空けてません
$_[0] =~ s/\*//g;
WebProgのPerlスレには書きましたが、こちらでも宣伝させていただきます
Perlスレ用のQ&A登録アプリをつくりました。 だれでも登録編集できます
スレで出た質問&解答をちょっと整形して登録していただけると嬉しいです
http://xxxyz.zive.net/~the2/mod-perl/thefaq/faq.cgi
>>139
レスポンスが速いですね。
mod_perlですか?
>>140
ども。 mod_perlとmod_gzipです。
>>139
URLっぽい文字列抽出してリンクになってるといいなと思った。
perldoc.com参照してるやつとか。
>>141
できればカテゴリなんかも設定できるようにしてよ
あと内容の校正は誰が?
コピペ突っ込むだけなら無料レンタルけいじばんでもOKな気がw
144デフォルトの名無しさん:04/08/02 00:54
>>142
OK

>>143
ひどいこと言うなー。
と、わかった。 カテゴリね。
まぁ、検索がついてるので、掲示板に貼り付けていくよりは良いという事で。
内容は各自。 荒らされても、一応バックアップは頻繁に取られてるので。
145デフォルトの名無しさん:04/08/02 01:00
wikiでいいよ
wikiの方がいいかも
>>139
RSSキボン
wikiにしたら荒らします♪
荒らしたら告訴します♪
告訴したら手伝います♪
151デフォルトの名無しさん:04/08/02 13:42
こんな感じでqmailのsendmail使ってメール送信するものを作ったのですが、
--------------
open MAIL, "| /var/qmail/bin/sendmail -f $from_add -t $to_add";
print MAIL "From: $from_add\n";
print MAIL "Subject: ここが件名\n";
print MAIL "\n";
print MAIL "$mail_honbun";
close MAIL;
--------------
ここで$to_add(メールのあて先)に複数のメアドを
$to_add="test1\@xxxx.co.jp,test2\@xxxx.co.jp"
って形で指定すると上手くメールが飛びません。

どなたか指定の仕方を知っている方お願いします。
152デフォルトの名無しさん:04/08/02 13:44
>>151
> open MAIL, "| /var/qmail/bin/sendmail -f $from_add -t $to_add";

|を前にもってくると入力になるんだけど。
153152:04/08/02 13:48
いやなんでもないなんでもない(^_^;) 見なかったことにして。
>>151
Perl 関係ない。 man sendmail したか?
-t の場合は宛て先をヘッダから抽出するようになる。その $to_add の指定は間違い。
ヘッダに To: とか Cc: とか Bcc: とかで指定する。
>>151
http://qmail.jp/
文面が痛いが djb と大先生なんだから我慢しる(w
個人的には、qmail-inject 推奨。

>>152
てめぇマァヴだな? > (^_^;)
>>154
qmailのは知らんがsendmailは-tするとヘッダからもあて先を
取り出すけど、コマンドラインで指定したあて先も有効だったような。

他に気になるのは、「,」で区切ってることだな。普通は別々の
引数になるように空白で区切る。本家sendmailはそれでも適当に
よろしくやってくれますがqmailのはどうだろうか?
うるへー! Wikiでもいいんだったらこれでもいいだろ

>>147
OK. RSS勉強してくるぜ
気づくといつのまにか Wiki になってた、という展開きぼんぬ。
159デフォルトの名無しさん:04/08/02 17:19
>>151 のロジック実行してメール送信してみた。

ちゃんとメール送信できた。
(ちなみに $to_add="test1\@xxxx.co.jp , test2\@xxxx.co.jp" ってやると複数指定できた。)

でも何故か送られてきたメールのTo欄の内容が無い。一切無い。

これは何ゆえ? そういう仕様なのか?
>>159
そういう仕様です。自分で To 欄出力してください。
>>159
「,」宛にもメール出されてないか?
use Hoge qw/foo bar/のfoo, barの部分はどうやってモジュール側から受取ればいいんですか?
163デフォルトの名無しさん:04/08/03 03:02
age忘れ
164デフォルトの名無しさん:04/08/03 06:45
import
165デフォルトの名無しさん:04/08/03 18:15
あるPerlスクリプトが、require等で別のスクリプトから呼ばれた場合と
直接起動された場合を区別する方法はありますでしょうか?
ActivePerlの5.8を使っています。
>>165
if (-t) {} else {} は無理?
>>166
レスありがとうございます。
試してみたところ、どちらの場合も -t が真となってしまいました。
>>167
あー、すまん。requireしている方もコマンドラインから起動してたら真になってしまうな。
俺にはわかんねーや。

ところでrequireされる方を起動して何が起きるの?やりたいことがよく分からんが。
普通1返して終わりじゃない?
あー、これでどう?
--- hoge.pl ---
require 'req.pl'

--- req.pl ---
if ($0 eq 'req.pl') {
print "direct"
} else {
print "required";
}
1;
>>169
こちらでも動きました。ありがとうございます。
やりたかったのは、単体としてもモジュールとしても使えるスクリプトです。
単体の場合はコマンドライン引数を用いて処理します。
>>170
> 単体の場合はコマンドライン引数を用いて処理します。
だったら @ARGV を調べればいいんでないの?
>>169
ふつー if (__FILE__ eq $0) では?
173デフォルトの名無しさん:04/08/04 02:59
@list = grep {/hoge/} @list;
$a = $list[0];

を1行で書きたいのですが、どうすればイイですか?

@list = grep {/hoge/} @list;$a = $list[0];
以外で・・・

$a = (grep {/hoge/} @list)[0];
>>173
>>174
@listの更新も入れたいなら
 $a = (@list = grep {/hoge/} @list)[0];
か? 試してないけど。
>>173
174,175以外で
@list = grep {/hoge/} @list , $a = $list[0];
($a) = grep {/hoge/} @list;
177176:04/08/04 08:15
>>176
@list = grep {/hoge/} @list , $a = $list[0];は嘘。 スマソ
意味もなく1行で書いてどうすんの?

正規表現でも無理やり一行で書いて、効率を犠牲にしてるのを見るけど。
効率は犠牲になってないかと思われ。別に速度計ってないけど。
あとこの場合は一行の方が見やすい気が?(たぶん。

>>173
@listん中には最初のヤツ入らないけど。
($a, @list) = grep {/hoge/} @list;
180デフォルトの名無しさん:04/08/04 13:21
みなさん、ありがと
>>174さんを使わせていただきます。
効率を気にするならこういうのはどうですか?本文は1行。

sub test { foreach (@_) {return $_ if(/hoge/)} }

$a = &test (@list);
182デフォルトの名無しさん:04/08/04 13:46
>>181
grepよりforeachで回したほうが速いんですか?
>>182
ベンチ取る癖を付けた方がいいぞ
モジュール使えば面倒でもないから
184181:04/08/04 14:05
>>182
たとえば、@list = ("hoge", "geho", "foo", "bar"); のとき、
 ・ (grep {/hoge/} @list)[0]; の文字列照合回数は4回
 ・ &test(@list) の文字列照合回数は1回

と考えました。ベンチ取ってないけど。
とりあえずベンチ。

use Benchmark;

@list = qw(hoge geho foo baa);

timethese(undef, {
grep => sub {
$a = (grep {/hoge/} @list)[0];
},
test => sub {
$a = &test(@list);
},
});

sub test { foreach (@_) {return $_ if(/hoge/)} }

で、結果は、
grep: 2 wallclock secs ( 3.11 usr + 0.00 sys = 3.11 CPU) @ 125654.98/s (n=390787)
test: 4 wallclock secs ( 3.09 usr + 0.01 sys = 3.10 CPU) @ 297963.87/s (n=923688)

hogeが最初は不公平すぎるので最後にしてみたがそれでも
grep: 2 wallclock secs ( 3.10 usr + 0.00 sys = 3.10 CPU) @ 126060.32/s (n=390787)
test: 4 wallclock secs ( 3.19 usr + 0.00 sys = 3.19 CPU) @ 205490.60/s (n=655515)

>>185
追試。環境は ActivePerl Build810 (5.8.4)

#!/usr/local/bin/perl
use Benchmark;
our @list = qw(hoge fuga piyo foo bar baz);

sub t_l { /hoge/ && return $_ for @_ }

timethese(-5, {
  g_b => sub { my $a = (grep {/hoge/} @list)[0] },
  g_e => sub { my $a = (grep /hoge/, @list)[0] },
  g_l => sub { my($a) = grep /hoge/, @list },
  t_l => sub { my $a = t_l(@list) },
});
__END__

Benchmark: running g_b, g_e, g_l, t_l for at least 5 CPU seconds...
g_b: 6 wallclock secs ( 5.16 usr + 0.00 sys = 5.16 CPU) @ 49723.26/s (n=256572)
g_e: 5 wallclock secs ( 5.32 usr + 0.00 sys = 5.32 CPU) @ 193839.10/s (n=1031224)
g_l: 5 wallclock secs ( 5.11 usr + 0.00 sys = 5.11 CPU) @ 199724.07/s (n=1020590)
t_l: 5 wallclock secs ( 5.33 usr + 0.00 sys = 5.33 CPU) @ 193475.42/s (n=1031224)
ソースコードは分かりやすいのが一番。
ということで、こんなのも。
use List::Util qw/first/;
my $a = first {/hoge/} @list;
※要Perl5.8
>>186
grepの条件をblockにしてるから遅くなってたのか。

1つの式ですむならblockにしてはいかんということだな。勉強になった。
189名無しさん@Vim%Chalice:04/08/04 19:15
PDFJ-0.76で質問です
nouhinsho.plのプログラムで使っているデータファイル
nouhinsho.datのデータを書き換えて
LANケーブル 0.5m アイボリー 5   aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
な感じにすると"aaa..."の部分が折り返されません。
LANケーブル 0.5m アイボリー 5   ああああああああああああああああああああああああああああああ
"あああ..."だったら折り返されます

"aaa..."な方でも折り返しにする設定はどうすればよいのでしょうか?
190デフォルトの名無しさん:04/08/04 20:22
Perlでコンパイラを作った人もしくはそのような
解説サイトをご存知の方いらっしゃいませんか?
191デフォルトの名無しさん:04/08/04 20:56
>>190
perlcc, perl2exe, parとかがある
Perl "の" コンパイラじゃなくて
Perl "で" コンパイラを作った人じゃないの?
193デフォルトの名無しさん:04/08/04 22:28
そんな無駄なことする人いるのだろうか?
194デフォルトの名無しさん:04/08/04 22:43
作れるわけね-じゃん
一応作れるぞ
Parrotコンパイラ・アセンブラはPerlで書かれているわけだが。
そんなことしても自己満足以外なんにもならないから誰もしないだけ。
たしかにPerlなんかで作っても遅いから
自己満足以外なんにもならないね。
199デフォルトの名無しさん:04/08/04 23:09
>>195
すいません
"おまいらには"
が抜けてましたw
200デフォルトの名無しさん:04/08/05 00:50
トランスレータならperlccだな
>>197
そんな事は無いと思うけど。
インタプリタ言語でコンパイラを作るって事は、昔のパソコン雑誌では
普通に連載されていたよ。
BASICでコンパイラ言語を、記述。
そのコンパイラのソースを、BASICインタプリタでコンパイル。
出来たコンパイラで、そのコンパイラ(のソース)を、機能拡張する。
そのソースを、コンパイラでコンパイル。
でまた機能拡張、またコンパイルまた機能拡張またコンパイル
きりねー。と。WICSなんかそうだったな。
コンパイルといっても、CやPerlのような大規模な
言語のコンパイルとは限らないからね。
コンパイルは要はファイル変換。小規模なものなら
Perlでも十分できると思う。

>>190
字句解析や逆ポーランド記法等の一般的な知識が
使えると思うので、
その手の勉強をしてみれば?
#/usr/local/bin/perl
$script = <STDIN>;
eval($script);
exit(0);

インタプリタができたYO!あとは標準入出力で(ry
cpanにyaccやlexのモジュールがぱらぱらあるから
それを作ったやつや使ってるやつを探せばいいんじゃないかな。
perl -e %1

バッチファイルでインタープリタが出来ますた。
インンタープリタじゃなくて丸投げって言うんだろ
インタープリンタです!失礼な………
PIC のコンパイラ/アセンブラとかあると嬉しいかも。既にあるのかな。
209デフォルトの名無しさん:04/08/05 13:44
トークンの切り出しとか字句解析はPerlの十八番だよな。
バイナリ(HEX)単位での扱いは?
yacc みたいなのの定番ってありますか?
Perl程コンパイラ向けの言語ってのも無いだろ。
速度だってそんなに遅くないし。
とか言う割には一向にコンパイラが挙がって来ませんねえ
Parrot
>>210
pack や unpack あたりでできそう。
でも、たしかに Perl ばかりやってるとバイナリの処理が
苦手になるかも…。
そこで Binutils のモジュール化ですよ。と云ってみるてst
Perlばかりやってるとバカになる
実感。C++, Java のコードが組めなくなってたり

「なんでExcelのマクロにPerlが使えないんだyp!」と発狂してみたり。
Perlだとすぐできるのに〜と思うことが多くなった。
Perlやってるとsh,sed,awkの使い方忘れる。
テキストの置換なんかは「あー、このソフトでPerl流の置換式使えたらなぁ」ってよく思う
テキスト入力なんかじゃ
ATOK用perl機能追加プラグイン
ttp://www.hirax.net/diaryweb/2004/04/09.html#200404092

なんてのもある
ATOK入ってないんで私は使えませんがね・・・
223デフォルトの名無しさん:04/08/06 00:11
ねぇ、pack や unpack ってどうやって使うの?
つか、どんなときにつかうの?
perlfuncを見りゃわかる。
Cなら構造体を作るだろうなってときに使う。
225デフォルトの名無しさん:04/08/06 02:30
>>223
CGIでURLエンコード・デコードとかに使う。
%82%CA%82%E9%82%DB
みたいなの
>>223
シリアライズ・デシリアライズ
>>223
カレーライス・ハヤシライス
228デフォルトの名無しさん:04/08/06 09:02
i18n m17n
229デフォルトの名無しさん:04/08/06 09:23
perlのハックして自分独自のperlを使ってる人いる?
自分独自のPerlってなに?
インタプリタをカーネルに組み込んで、
モジュールをPerlで書けるようにするとか?
231デフォルトの名無しさん:04/08/06 10:28
dukeで画像掲示板に画像をアップしたいのですがうまくいきません
>>229
昔のえらい人たちは Perl をハックして JPerl を作った
みんな感謝して使っていた
>>189

「折り返し」って? foldingのこと? アルファベットは空白文字が来ないと
発生しないよーな希ガス。
>>232
じゃあ君のために KusoPerl っていうの作ってあげるから
感謝して使ってくれ。
夏だな
>>234
もっとカルシウム取れよ。
>>234
今日の宿題は終わったのか?
おやつ食べて大好きなプールにでも行ってきたらどうだ?
238デフォルトの名無しさん:04/08/07 14:27
なんか書けよ。
なんか
240デフォルトの名無しさん:04/08/07 18:47
Perl6のリリースは2006年だってさ
http://japan.linux.com/desktop/04/07/27/1436242.shtml?topic=1
>>240
そんなに待てるか!
俺、死んじゃってるかもしれないじゃないか!
不治の病を患ってるやしがいるな(ノД`、)逝`
人間は全員不治の病を患っている。
244デフォルトの名無しさん:04/08/08 08:52
packageに外部に公開しないサブルーチンを作るにはどうすればいいでしょうか?
(JavaとかC++のprivateメソッドっぽいのを作りたい)
my をつける
"my sub" not yet implementedと怒られてしまいました
sub my だ
syntax error at ***.pm line 16, near "sub my ***"
えー?
249黒死犬 ◆EgxBlf8nvc :04/08/08 10:41
my $unko = sub {
return $$**$$;
}

しかし、そのうち my sub って書ける様になるらしい
そのうち = Perl6
前川くん、マルチポストは・・・・・
ikannzaki
>>249
$$**$$ってパッと見ただのデタラメに見えるが
$$はプロセスID,**はべき乗演算子なので正しい
式なのか...
$hoge{"ユニークな文字列"} = ユニークじゃない数値
というハッシュがあるんですが、これを数値の降順にソートして、
値が大きい方からいくつかの要素、というかキーの文字列を取り出したいんですが、
どうするのがかしこい方法でしょうか。
数値がユニークなら、キーと値を入れ替えて、keys %hogeをsortでソート
すればいいのでしょうけど…。
前川くん、お礼は・・・・・?
>>254
とりあえず正攻法で。

my @ranking = sort { $hoge{$a} <=> $hoge{$b} } (keys %hoge);
>>255
前川君とやらが誰かは知らないが粘着はやめれ。
>>256
問題の意味がわかってない馬鹿
>>258
ありゃ、間違い?どういう問題だったの?
>>257
2回名前が出ただけで・・・・・・


























前川くん、必死だな
前川君ってのが誰なのか、このスレしか読んでない俺に説明してくれ
>>244
man perlstyleによると、名前が"_"で始まるサブルーチンは
パッケージ外部から呼ばない約束にしています。

実際には公開されているけれど、コーディング時のマナーで対処すると
いうことだと解釈してます。
>>258
>>256 であってると思うが
>>258
おれも合ってると思うが、降順にするなら$aと$bは逆だな
>>264
がーん。スマソ、逆だったか・・・_| ̄|○
>>265
むしろ>>258が「問題の意味がわかっていない」我々に、正しい問題の
意味と解答を見せ付けてくれることを希望。
ソート順程度のケアレスミスを「問題の意味がわかっていない」など
と大袈裟な表現をして悦に入るような馬鹿ではないだろうから、きっ
と我々を仰天させ、沈黙させるような素晴らしい「かしこい方法」を
示してくれるに違いない。
内容の無いいちゃもん付けは大抵ヘタレだから無理
むしろ >>258>>256 の意味をわかっていないと思われ

>>268
俺もそう思う
>>262
派生クラスでオーバーライドするのはあり?
CGI::Session::Authはそれやらないとだめなんだが。sub _login {}
いいんじゃないの?
protectedメソッドたと思えばいいじゃない。
272デフォルトの名無しさん:04/08/10 00:01
つーか、perlでOOPって無理があるよね
273デフォルトの名無しさん:04/08/10 00:02
>>272
うん
>>272
かなりね
っていうか無理にPerlでOOPしても嬉しくないから
そういうときはRuby使う
インスタンスの生成ができるのは便利だ
なんか知らんがこんなスレが立ってます。
http://idol.bbspink.com/test/read.cgi/ascii2d/1073747234/
アホや
278デフォルトの名無しさん:04/08/10 16:43
はじめまして
>
#!/usr/bin/perl

print<<HTML_DOCUMENT;
content-type: text/html

<html>
<body>
こんにちは<br>
私の名前は藤森水絵です<br>
</body>
</html>
HTML_COCUMENT

をコンパイルすると必ず
>C:\httpd\cgi-bin>perl 52.pl
Can't find string terminator "HTML_DOCUMENT" anywhere before EOF at 52.pl line 3.

というエラーが出てきます。
どうしたらよいのでしょうか?
解決方法知っている方教えてください。
typo
下らんことで他人の手を煩わすな。
>>278
エラーメッセージが指定する行数に間違いが見つからなかったら
その前後の行と、関連する事柄などをチェックすること。

もうね、ソースの一番最後の行でおじさんがっくり来ちゃったよ。
> Can't find string terminator "HTML_DOCUMENT" anywhere before EOF at 52.pl line 3.
終端文字列「HTML_DOCUMENT」がファイル終端以前の何処にもありません。(52.pl 3行目)

読め
コキュメント・・・。
>>278
Perlの前に、少し英語を勉強するといいかも。
284279:04/08/10 19:57
>>278
>>279撤回。
みんなつまらんミスを論うのが好きなようだ。
どんどんやってくれ。
my で$a,$b・・・といくつもの変数すべてに0を入れたいんですが、
以下のやり方より、もっと効率的な書き方はないでしょうか?

my($a,$b,$c);
$a=$b=$c=0;
>>285
my($a,$b,$c) = (0, 0, 0);
my($a,$b,$c) = (0) x 3;

tu-ka、初期値がどうしても必要になるところとか、無駄に変数宣言していることを改訂してみるとか。。。
>>286
整数の宣言のつもりで0を入れてたんですが、要らないんですねorz
一部初期値が必要なところがあるんで、(0) x 3 を活用できそうです。

ありがとうございました。
288デフォルトの名無しさん:04/08/11 08:02
>>287
最初から0が入っている気がs(ry
>>276
キショ
>>288
my $a; で $a の値は undef 。undef は数値として評価すれば
0 だが文字列として評価すれば空文字列なので、陽に 0 を
入れておかなければ以下のような場合に困る。

my($a, $b, $c);
print join '|', $a, $b, $c, "\n"; # |||

文字列としての 0 が必要になった段階で、

# 数値コンテキストにおけば値は undef のまま "0" を得られる。
print join '|', $a, $a + 0, "$a\n"; # |0|

# 0 を足したり、代入してしまえば以後も "0" として扱える。
$b += 0; $c ||= 0;
print join '|', $a, $b, $c, "\n"; # |0|0|
291デフォルトの名無しさん:04/08/11 10:13
ここの人はPerl用のIDEには何を使ってるの?
>>291
まずは藻前が答えれ
今時Cをcatとechoで書いてる変態はいないだろうが、
perlならまだまだいるのでは?もともとワンライナーで
バーっと書くのに都合がいいツールでもあるし。
294デフォルトの名無しさん:04/08/11 11:52
>292
Open Perl IDE

295デフォルトの名無しさん:04/08/11 12:49
初めて投稿します。
Perl/Tkについて質問です。

メインウィンドウ全体に背景画像を貼り付けたいのですが、オライリーの「入門Perl/Tk」を読んでも
やり方がわかりません。
ぐぐっても、見つかりません。

フレームを使ってもイメージはサポートしていないようですし。

ご存知の方、サンプルソースもしくはURIを貼ってもらえると助かります。

板違いだったら、誘導をお願いします。
296デフォルトの名無しさん:04/08/11 18:29
>292
オレはPhantom
>>291
vi で何の問題も無い。
298デフォルトの名無しさん:04/08/11 20:06
>297
Windows環境で使えるviってある?
299デフォルトの名無しさん:04/08/11 20:29
ここって情報返ってくるの遅いね。
今更Perlなんて使ってる香具師ほとんどいないからな
Perlerな俺って少数派だったのかorz
>>301
しぃーっ! いまどき Perler ですだなんて恥ずかしいから隠しておいた方がいいよ。
Perl

Ruby…スクリプト言語でOOしたい。
Python…シェルスクリプトとして使いたい。
PHP…WEB向けスクリプトが書きたい。

さようならPerl
304デフォルトの名無しさん:04/08/11 21:27
いまだにPerlしか使えないプロバイダ多いと思うけど、
その辺の事情はどうなの?>303
>>303
Ruby,Python,PHP

Perl6…スクリプト言語でOOしたい。
Perl6…シェルスクリプトとして使いたい。
Perl6…WEB向けスクリプトが書きたい。
>>305
もし LLW に行ってそこまで言えるとしたら頭がおかしいとしか言いようがない。
エディタはおれも vi 。
それで十分だなぁ。
秀丸な俺って少数派なのかなorz
309デフォルトの名無しさん:04/08/11 23:00
orzって何?
○| ̄|_
orz
どこもかしこも寂れてるね
>>298
cygwinとか。
>>298
普通にvimとか
ってか、viって何故好んで使うんだ。
絶対おかしいって。
オナニーとしか思えん。
何で井出らっきょの話がエディタの話になってるんだ?
>>315
さむ・・・
わしゃxyzzy

>>298
最近gvimを使ってみましたが多機能でした。perlソースをカラー表示したり。
ttp://pc5.2ch.net/test/read.cgi/unix/1086135625/

それ以前はこのjvimを使ってました。
ttp://www.vector.co.jp/soft/win95/writing/se041333.html
319デフォルトの名無しさん:04/08/12 14:30
Perlに限らずだけど、ソースカラー表示って
見にくくて使いにくいと思わんか?
コメントは緑じゃないと嫌
おとなしめの色に変えて使ってる。
typoは多少減ってると思う。
青い文字でcolor=redと書くところを想像して萎えた。
color=transparent と(ry
初めて色付き見た時、なんてうざいエディタなんだろと思ったけど
30言語以上定義を登録しているので今となっては手放せない。
vimはctermの呪縛から離れられないので、デフォルトの色付けは半ばデモというかヤケというか…
327デフォルトの名無しさん:04/08/13 01:00
30以上の言語を知っててなんのとくになるのか?
マシン語しってりゃすべて事足りるのだが・・・
また痛いのが現れたな
つか低レベルな釣りだろ
アセンブラのカラー表示ってどんなイメージなんだろうか
331デフォルトの名無しさん:04/08/13 07:54
タブ区切りの文字列をsplitで分割する際の正規表現で

/\s+/

より速い書き方はありますか?
332デフォルトの名無しさん:04/08/13 07:54
o とか付けたらどう?
333デフォルトの名無しさん:04/08/13 07:56
>331
/[ \t\r\n\f]+/
だとえらく遅いね。
334デフォルトの名無しさん:04/08/13 07:59
この場合は o は効かないだろう
335デフォルトの名無しさん:04/08/13 08:10
>331
やろうとしていることと関係あるかもしれないネタを1つ。
ファイルから1行ずつ読み出して処理しようとしているなら

while (<IN>) {
@elem = split(/\s+/);
}

よりも

while ($line = <IN>) {
@elem = split(/\s+/, $line);
}

の方が圧倒的に速いです。理由はよく知りません。
/\t+/
337デフォルトの名無しさん:04/08/13 08:23
>336
それは遅かったです。
/\t/
339デフォルトの名無しさん:04/08/13 08:26
>335の案が最速じゃない?
340デフォルトの名無しさん:04/08/13 08:28
>338
あ、これ速いです。この場合って行末の改行って無視してくれます?
341デフォルトの名無しさん:04/08/13 08:29
ちょっとやってみたけど微妙だなー。
/\s+/
ならchompしなくていいよね。

chompして>338の案を採用したのとどっちが速いか
実測しないとダメでしょ。
改行削除してからsplitすれば?
いままでの実測値希望
344デフォルトの名無しさん:04/08/13 08:33
>341
やってみた。25000行くらいのTSVファイルを読み込み。
(1) chomp & /\t/
(2) /\s+/
10回試行の合計タイム


(1) ・・・

なんと4回試行して2勝2敗ww
345デフォルトの名無しさん:04/08/13 08:33
>343
ちょっと待ってください。
346デフォルトの名無しさん:04/08/13 08:39
約25000行のTSVファイルを1行ずつ読み込み、splitで分割。
10回分の合計タイム。

(1) chompなし、/\s+/→5.417 msec
(2) chompなし、/\s/→6.869 msec
(3) chompなし、/\s{1}/→7.28 msec
(4) chompなし、/[ \t\r\n\f]+/→7.31 msec
(5) chompあり、/\t+/→7.53 msec
(6) chompあり、/\t/→5.387 msec

こんな感じ。でも(1)と(6)はやる度に勝敗が変わる。
347デフォルトの名無しさん:04/08/13 08:41
ちなみに(1)のパターンで>335の対策を行わないと
8.251 msec

正規表現よりも、こっちの方が効果絶大。
chompだけのときのタイムとか
/\t/だけのときのタイムとか
349デフォルトの名無しさん:04/08/13 08:45
>346
オレ環境だと(6)が毎回速い。
350デフォルトの名無しさん:04/08/13 08:47
>348
空ループ→2.653 msec
/\t/だけ→5.277 msec
chompだけ→2.814 msec

こういうことかな?
351デフォルトの名無しさん:04/08/13 08:48
今までは(1)で書いてたけど、よく考えたら(6)がよさそうだな。
>>350
chompの影響ってほとんど無いんだね。
353デフォルトの名無しさん:04/08/13 12:45
ちなみに
@elem = split(/\t/, $line)
のところを
($a, $b, $c, $d, ・・・) = split(/\t/, $line);
とすると若干遅くなるね。

オレは知らず知らずのうちに最速コードを書いていたらしい。
354デフォルトの名無しさん:04/08/13 13:12
>346
ホントかなーと思って私も実験してみたんですが、
速い順に
\t > \s+ > \s > \t+
ですね。\t には + が付くと遅くなるのに、\s には + が
付くと速くなるのはなぜなんでしょうか。
対象ファイルの内容で結果は大きく変わるんでしょうか?
>>354
/\s+/ は split の第一引数のデフォルト値で、
このパターンは内部的に最適化されているから。
http://perldoc.com/perl5.8.4/pod/func/split.html
357デフォルトの名無しさん:04/08/13 13:39
>335
この件だけど、細かく見ると、splitにかかる時間は変わらないんだけど、
@elemに代入する時間が圧倒的に違いますね。
358デフォルトの名無しさん:04/08/13 15:06
>>357
代入するときに$_ の記憶領域を内部コードの中で再利用してるんじゃないの?
$_ が右辺値にくるようなリスト代入をやると$_ を使わない場合に比べて時間がかかるよ。

たぶん、リスト代入を行うときに$_ の記憶領域を テンポラリに使用していて
右辺値に$_ が記述(もしくは変数が省略)された場合、$_ の内容を破壊しないように
内部コードのテンポラリの代入操作の直前で$_ をスタックしているのかもね。
だから、代入する数が増大すると時間がかかる。

$_ が右辺値にこなければ、処理全体の直前に1回だけスタックするだけだから時間がかからないと。

そう考えると処理効率を考えた場合は、$_ は無闇につかわない方がいいね。
359デフォルトの名無しさん:04/08/13 15:23
>358
うーん、オレが今まで書いたPerlコード結構速くなりそうだな。
>>335の下より上のほうが綺麗だよな、うっとり・・・♥

していたが、下のほうが速いのか…
俺のコードも見直すと速くなりそうだ
while (my $line = <IN>) {
@elem = split(/\s+/, $line);
}

while ($line = <IN>) {
@elem = split(/\s+/, $line);
}

どっちが速い?
362デフォルトの名無しさん:04/08/13 16:34
>>361
下の方が早い。

上の方はループする度に$line 変数の記憶領域を毎回確保しなおすからそれがオーバーヘッドになる。
ただし、ファイルの入力処理のオーバーヘッドの方が十分でかいので無視しても問題ない。

ちなみに自分の環境で1千万行のデータを全て読込むことを想定した場合、上と下とで3秒の差がでてくる。
自分は上のコードをいつも書いているが、この3秒のためだけに下のコードに変えたくない。
ならwhile (<IN>)も毎回確保し直すから遅いだけじゃないの?
while (<IN>)もwhile (my $line = <IN>)も同じ速さって事でしょ?
364デフォルトの名無しさん:04/08/13 16:55
>>363
オーバーヘッドの場所が違う。

>>335の上は

while ($_ = <IN>) {
@elem = split(/\s+/,$_);
}

の省略型で
オーバーヘッドになっているのは

@elem = split(/\s+/,$_);

の部分
右辺値に$_ があるから@elemへのリストの代入個数が増えると
$_ のスタック回数も一緒に増えているみたいだと言っている。

while (<IN>) {
$line = $_;
@elem = split(/\s+/,$line);
}

とすれば>>335の下と実行速度はほとんど変らない。
350\t\t50\t20
124653215\t50\t20
みたいなデータがあった時(\tで桁合わせしてるTSV)

(5) chompあり、/\t+/→7.53 msec
(6) chompあり、/\t/→5.387 msec
はどちらも正しく分割できるの?
366デフォルトの名無しさん:04/08/13 16:58
各行の末尾に余分な \t を1つ付けて、chompなしでsplitして
各行の最後の要素は捨てる、という裏技を考えたんだけど、
かえって遅くなってしまった。。。

split で分割される要素数も重要なのね。

不要なカラムがないかどうかとかチェックした方がいいかも。
367デフォルトの名無しさん:04/08/13 16:59
>365
それはずれちゃうんじゃない?
368デフォルトの名無しさん:04/08/13 16:59
>360
省略はPerlの美学ってとこあるからなー。
それにしても、たかがタブ区切りファイルの処理で
やけに盛り上がってるね。
ファイルキャッシュに溜まってる同じファイル何度も読むわけじゃないんだから
どう考えても$_と$lineの差なんかよりIOの方が遅いのにね。
370デフォルトの名無しさん:04/08/13 17:15
>>369
その通りなんだけど配列へのリストのコピーはループ内で結構使うんで
右辺値に$_ があるだけで右辺値の個数に比例して時間が掛かるのはさすがに
無視できないなと思ったわけ。
>>368
普段は適当にやってもうまくいく。
ちゃんと考えたかったら、ちゃんと考える事も出来る。

この塩梅が俺は好きだ。
>>371
ちなみにメモリの容量や、実行効率を考えなければ
こんなコードで2重配列にデータをセットできちゃうPerlがこよなく好きだ!

@elem = map{[split/\s+/]}<IN>;
>>369
別に<IN>と書いてある場所で毎回イオが発生しているわけではない。
>>373
バッファリングしてるもんね。

select IN;
$| = 1;

とかやっていたらバッファリングはしないけどね。
バッファリングしてても重いよ。
フルバッファリングするわけじゃないし。4KBくらいだろ
>>375
あ....、すまん、オレの書き方が悪かった。
>>374は、>>373を肯定していて、イオはデフォルトでバッファリングしているから
>>373なんだよっていいたかったわけで、バッファリングすれば大丈夫っていうことではない。
まあ、IOうんぬんはおいといて  @elem = split(/\s+/)  が
思わぬ速度ロスを招いていたというのは今日の収穫だった。
>>368
いろんなところで予想を裏切る結果だったから
379デフォルトの名無しさん:04/08/13 21:07
皆さん、色々ありがとうございました。
私の素人質問(>331)が役に立ったようで何よりです。
>>379
お前総括しろよ
381デフォルトの名無しさん:04/08/13 21:55
>>331の質問が切っ掛けになったのはたしか。
ただ自分にとっては、>>357とその元レスの>>335が一番の引き金だった。
382デフォルトの名無しさん:04/08/13 22:51
>380
総括。終了。
383デフォルトの名無しさん:04/08/13 23:34
おいおい、俺のたてた名スレのURL貼るなよ
おいおい、そんな迷スレたてるなよ
> 別に<IN>と書いてある場所で毎回イオが発生しているわけではない。
爆発系全体攻撃呪文かと思いました
あーあ。みんな思ってても書かなかったのに。
388373:04/08/14 03:02
むしろ俺はファイラーとかそういう方に反応するけど?
あれあれ? 怒らせていいんですか? 使いますよ。イオナズン。
またつまらんスレに戻ったな
お前がトドメだな。
392デフォルトの名無しさん:04/08/14 08:31
そういや split の代わりに /〜/g 使ってどうにかしたら速くならない?
393デフォルトの名無しさん:04/08/14 13:16
ならない・・・
394デフォルトの名無しさん:04/08/14 13:28
サブルーチンが存在するかどうかって調べる方法ありますか?
ある・・・とだけ言っておこう。
396デフォルトの名無しさん:04/08/14 13:35
eval
397デフォルトの名無しさん:04/08/14 13:47
eval じゃない
398デフォルトの名無しさん:04/08/14 13:55
eval じゃない?
defined使えよ・・・
400デフォルトの名無しさん:04/08/14 14:05
>399
definedじゃムリだろ。
オレもdefinedで実現する方法は分からん・・・
Perlは初心者レベルなので、間違ってたらスマソ

print "Sub1は存在しま";
if(defined(&sub1)){ print "す"; } else { print "せん"; }
print "\nSub2は存在しま";
if(defined(&sub2)){ print "す"; } else { print "せん"; }
exit(0);

sub sub1{}
#sub sub2{}
if( main->can("subhoge") ){
 print "i can subhoge";
}

sub subhoge{ }
404黒死犬 ◆EgxBlf8nvc :04/08/14 14:57
Stashを覗く

print("I can", defined(&{"::sex"})? "": " not", " sex.\n");
sub sex {};
>403
知らなかった・・・
>>405
普通はオブジェクトに適用するものだから。
構文糖的にインチキしてみた。
詳細は続初めてのPerlを読んでくれ、あれは良い本だ。


どこに書いたらいいか解らずここに着きました。

自分のやりたい事って意外と
凶悪なのかもしれないのですが、可能な物なのか知りたくなりました。
良くPeal可ってありますよね?鯖屋さんの鯖上にpeal(LWP)自動巡回エンジンを使って
巡回代行させたいのです。リクエストすればzip圧縮してアーカイブして
DL可能とかstmpエンジン内臓させて、である程度の巡回内容の量になったら
zip圧縮してアーカイブしてメルアドに自動送信とか
させたいんですが。

これって可能でしょうか?似たようなサービスはありますが、
自分用に自由に定義して使い倒したいのですが
不可能でしょうか?
可能です
不可能だと疑う理由が分からん。
ああ嬉しい。レス有難うです。
可能ですか。

何分知識不足な物で。
WindowsのActive perlから入った初心者な物で皆様のご意見が聞きたかったんですが、
自鯖も頑張れば立てられるかもしれませんが(空PCは有りますが)
自宅鯖上ではなくレンタル鯖でやりたいと思ったのですが、可能でしょうか?。

鯖屋さんのグレードによるのかなぁとか考えてしまいますが、
一般的な無料では不可なのでしょうか?




 
>411
まあここでそういうレベルの質問してるようじゃ
無理だろうな。もっと勉強しろ。
すいません。
おまいら釣られんなよ、いくらなんでも peal に stmp はねぇだろ。
>>408-409
っていうかおまえらエスパーかよ
>>407の日本語がさっぱり理解できん
(゚∠゚)ニホンゴムズカスィネー
>>411
レンタル鯖でも可能。
ネットへのアクセス(LWPやソケット)が使えるか、
簡単なスクリプト書いて試してみれ。

ただし、無料サバなら不可のところも多いのかも。
サバ屋の中の人の設定次第。
perl6、perl5と互換性無いのにオライリーのラクダ本上下巻、リャマ本(両方とも新品で)
合わせてeffective perl買ってしまったのは(合計1万5千円程した)馬鹿ですか?
418417:04/08/15 05:55
詳細 正規表現(Perl5.8用)も買ってしまいました。
よく、金あるね。
俺、8000円で悩んでいるのに。。。
420417:04/08/15 06:28
perl5と互換性の無いperl6出るのに今perl5覚えても意味無いですか?
>>420
プログラミング言語なら、どれ覚えても意味あるよ。
大切なのは言語によらない、普遍的な部分だからね。

ちなみにおれも、ラクダ本上下、クックブック持ってます。
買値以上の価値は絶対あるよ。
422417:04/08/15 07:11
いくら互換性が無いって言ってもperl5覚えてたらperl6習得に役立ちますか?
423417:04/08/15 07:14
>>421
ありがとうございます。
高い買い物がperl6の登場で役立たなければどうしようかと焦りました。
424417:04/08/15 07:15
役立たなければ⇒無用の長物になったら
基本概念は一緒じゃない?
>>425
同意。大事なのは文法の下にある思想やポリシー。
そのエッセンスが自分の考え方の幅を広げ、他の言語にも応用できるようになる。

perl6の新機能とobsolateされた機能を知りたかったならあちゃー・・・・って感じ。
ラクダ本のperl6対応が出るのは(第四版?)まだ先ですよね?
というかオライリーのperl6本。(英語版は出てますが)
Perlごときにそんな分厚い本買ってるからオタって言われるんだよ。
一応言っておくけど俺はアンチじゃないよ。Perlまんせ〜☆
>>428
ヲタクに区別無し。
自分のことを棚に上げ相手をヲタク呼ばわりしているお前もまたヲタクなのです。
アニヲタとは

趣味で金を稼ぐことができる/浪費するの違いがありますが。
>>430
どちらもヲタです。徳の違いはあれどどちらが上下というモノは存在しません。
上下があるという意味で言ったわけではありません。
前後くらいはありそう
>>433
どちらにせよ尊敬することはあれど蔑むことは許されません。あなたもまたそうなのですから。
彼もまた大切な(ry
436428:04/08/15 12:32
>>430
おまいの言うことはスルーしないぞ。
画面に変なアイコン並べてわけわからん用語使うアニメ野郎と一緒にすんな!
俺はクールでダンディなヲタクなのさ。
>>436
人の話聞けや。お前もヲタクで彼もヲタク。ただそれだけでお前に彼を笑う資格はない。
>>417
続・初めてのPerl も買え、まずはラクダ本よりもむしろそっちだ
439デフォルトの名無しさん:04/08/15 12:57
今参加するともれなくヲタクになれます。
今日は暇だからどこか行こうかな。
え、マジでPerl6になると全面的に仕様変わるの?
変数の前に $ @ % がいらなくなるらしい
マジ?なんか逆に邪魔な機能だな。
速度はどうなの?
>>442
マジで? 特殊変数はどうなるのさ。
> Perl 6はよりクリーンな言語であり、仕様もより論理的になっている。Conwayによれば、
> すべてのスカラー変数は「$」記号で識別され、「$」記号で識別されるのはスカラー変数だけである。
> さまざまな識別子(「$」、「@」、「%」など)を持つさまざまな変数をさまざまな方法で使うのではない。
> 新バージョンのPerlでは、事実上、使用可能なすべての特殊文字が使用されている。標準のASCII以外の、
> Unicodeの空間の文字も使用されている(これらの文字はキーワードで代用することも可能だ)。
へぇ〜
で、最近気付いたんだが(ベンチマークで)
意外だったのが 
横に長く構文を書くより、
適度に改行して書く方が動作速かった
PerlといいPHPと言い結局同じもんになりつつあるな。

もう全部Javaでいいじゃん!とか世界の中心で叫びたくなるな。
>>447
Java使いか?
Javaの方が速いしOOPとか便利だけど、導入するのがめんどい。
Java、記述が長くなる・・・。
>>446
俺も前に調べたことあるけど、その時のベンチ結果はまったく生かされていない。
つーか、どちらが速いかすら忘れた。
他にもforで1万回printするのとprintを1万行並べるのはどちらが速いかといった
どうでもいいものを調べた事もあったなぁ。
Perl の正規表現の書き方(マッチとか置換とか)が
かなり使いやすくて強力なんだよなぁ。
その辺りがJavaだと・・・。
>>452
regexアルから取りあえずは良いけどね。
無い言語なんて使ってられん。

方言は置いといて結局はクラス型のOOに収束するのが少々悲しい。
454446:04/08/15 14:51
後、スクリプトの先頭で
my($hoge, $abc) = '';
my(@test) = ();

とかしたら劇的に速度速くなったぞ。いやマジおすすめ
>>454
use strictとかcarpとかは、「劇的に」遅くなりますか?
おしえてケロ。
Perl5のOOとかPHP4のOOは終わってる。
やっぱC++かJavaだね。
>>454
すんごくくだらない事なんだけど・・・
>my($hoge, $abc) = '';
この部分、リスト評価へスカラーで初期化するのはおかしい気がする。
my($hoge, $abc) = ();
こうじゃないかな。
別に間違いじゃないんだろうけど、
でもなんとなく他人のこういう所が気になる・・・
左辺値がリストで右辺値がスカラならそれぞれの左辺値に右辺値が代入されるんじゃないの?
>>458
うーん、たぶん違う。
@hoge = "ほげ";
こんな事しても、$hoge[0]には代入されるけど、
それ以降の配列はnull
WindowsXP、Perl v5.8.4でテストしようとした。
中の人に怒られた。MSの底力を感じた。

use Benchmark;
timethese(-1,{
'Carp' => sub {
my $pid = undef;
unless ($pid = fork) { eval 'use Carp;' }
waitpid $pid, 2;
},
'strict' => sub {
my $pid = undef;
unless ($pid = fork) { eval 'use strict;' }
waitpid $pid, 2;
},
});
useって初回以外は計測しても意味無いんじゃないの?
#!/usr/bin/perl

〜処理〜

my($user, $system, $cuser, $csystem) = times;
print "\n",'--------------------',"\n";
print 'User : ',$user,"\n";
print 'System : ',$system,"\n";
print 'User(child) : ',$cuser,"\n";
print 'System(child): ',$csystem,"\n\n";
print 'Total : ',$user + $system + $cuser + $csystem,"\n";
print '--------------------',"\n";
exit;
>>461
つか、しょえるの外からtimeとかで計測しないと意味ないんでないの?
C:\Perlにあるabc.txtっていうファイルから、
defっていう文字列を含む行を削除するにはどんな構文を書けばいいんでしょうか。
初歩的ですみません。
465デフォルトの名無しさん:04/08/15 21:37
ageておこう
>>464
perl -i.bak -ne "/def/ || print" C:\Perl\abc.txt
>>466
ありがとうございました。
目的に合わせて改変してみます。
grep -v def abc.txt でいいよな
469デフォルトの名無しさん:04/08/15 21:57
>C:\Perlにあるabc.txtっていうファイルから
windowsだが・・・
470デフォルトの名無しさん:04/08/15 22:06
Cygwinでもいれればいいだろ
grep.exeと書けば満足か
472デフォルトの名無しさん:04/08/15 23:59
はい
.exeは省略しても実行できるような気がするが
>>473
>>469のように勘違いするやつが出てくるからだろ。空気嫁
475411:04/08/16 08:29
>416様
ありがとうございました。
さっそく試してみます。
ActivePerlはモジュール少ないyo...
インスコしなはれ
標準で入っているモジュールの話?
それともppmにあるモジュールの話?
標準モジュールが足りないと思ったらppmで入れる。
ppmが足りないと思ったらcpanで入れる。
それでも無かったら、ネットで直接DL。
それでも無ければ、自作。
結局無いっつわれたらcpan使えばいいだけじゃん
>>457
厳密な意味で意図した初期化になってない。

null文字列で初期化したければ
my($hoge, $abc) = ('','');

未定義値で初期化したければ
my($hoge, $abc) = ();

もっともmyで新しいローカル変数を定義しているから
my($hoge, $abc);
でも未定義値で初期化される。

my($hoge, $abc) = '';

my($hoge, $abc) = ('');
と解釈され、$hogeがnull文字列、$abcが未定義値に初期化される。

よって defined の結果が違ってくる。
>>481
おお〜
ちょっと感動した
こんな基礎的なことで感動されても
素直に喜びナ
空リストの代入は、ハッシュと組み合わせたりすると
有効なキーかどうか判断するときに便利だよね。

@valid{qw"xyz abc ijk"}=();
if(exists $valid{$in}){
print "有効です\n";
}else{
print "無効です\n";
}
>>442,445
$hoge はスカラ
$hoge[$key] は配列の要素のリファレンス
$hoge[@key] は配列の要素のリファレンスのスライス
$hoge{$key} はハッシュの要素のリファレンス
$hoge{@key} はハッシュの要素のリファレンスのスライス
$hoge(@list) は関数のリファレンス
$hoge{$key} はハッシュの要素のリファレンス
@hoge は配列
@hoge[$key] は配列の要素
@hoge[@keys] は配列のスライス
%hoge はハッシュ
%hoge{$key} はハッシュの要素
%hoge{@keys}はハッシュのスライス

配列をスカラで評価すると配列のリファレンス
ハッシュをスカラで評価するとハッシュのリファレンス
配列のリファレンスを数値コンテキストで評価すると配列の要素数

ていうPerl6の初期仕様は破棄されたの?
環境依存の話で申し訳ないのですが、以下のような状況で
DBD::Oracleを作成して利用したいのですが、どうすれば
よいのでしょうか?
スレ違いなら申し訳ありません。どこかふさわしいスレが
あるなら紹介していただけると助かります。

OS :Windows2000
Perl:ActivePerl 5.8
インストール済みOracleソフトウェア:Oracle Clients for Windows
使用したい状況:Apache2.0+mod_perlからSoralis上の
Oracleに接続したい

CPANからDBD-Oracle.tar.gzをダウンロードしてビルド
しようとしても、"ORACLE_HOMEが間違っている"とエラー
になってしまいます。
(レジストリから自動検索してC:\orantがORACLE_HOME
として認識されているようです。)

別の解決方法としてActivePerl 5.6にすれば、DBD::Oracle
は存在します。
しかし、mod_perl(Apache2.0用)がビルドできなくなってし
まいます。
>>487
Makefile.PL 適当に書き換えりゃイインジャネーノ
489デフォルトの名無しさん:04/08/16 23:18
Perlのオブジェクト指向について質問です。
通常オブジェクトのメンバ変数にアクセスするには、アクセスメソッドを通して行いますが
少し疑問があります。
#######################################
Package Hoge;
sub new{
my $self = shift;
my $hashref = shift;
bless { hashref=>$hashref },$self;
}
sub hashref{
my $self =shift;
%{$self->{hashref}} = ( @_ ) if ($_[0]);
return $self->{hashref};
}
#######################################
Package main;
use Hoge;
my $test = { hoge=>1,hage=>2 };
my $obj = Hoge->new($test);
my $hashref = $obj->hashref();
###########################################

この状態でメインパッケージにの$hashrefに
$hashref->{$_} =~ s/.//g foreach keys %$hashref;
をやってしまうと、Hogeクラスのオブジェクトのプロパティにまで影響を与えてしまうんですが、
これはよくないことですよね?アクセスメソッドの返り血を、リファレンスにするのは禁止事項なのですか?

そういう記述がみつけられないんですが;エロイ人カコイイ回答をおながいします。
490デフォルトの名無しさん:04/08/16 23:21
釣りかな
491489:04/08/16 23:28
>>490
真面目です。実はPerl初めて2ヶ月くらいで、パソコン触り始めたのが4ヶ月前位なので
かなり初心者ですorz
アフォな質問なのかもしれませんが、どうかおながいします。
492デフォルトの名無しさん:04/08/16 23:34
OOP信者でも釣ろうとしているのかと思った。スマソ
>>481
>my($hoge, $abc) = '';
>は
>my($hoge, $abc) = ('');
>と解釈され、$hogeがnull文字列、$abcが未定義値に初期化される。

言ってる事は正しいがこの部分はおかしいだろーと。
スカラーはスカラーで評価されるんだって。
なぜ配列(リスト)で評価されるんだよ。
挙動は同じだが評価のされ方は厳密には違うだろ。
>>489
うーん・・・
戻り値をリファレンスにするのはよくないとか、
そんなのないと思うけど。
好きにすればいいかと。
たとえば影響を与えたくない物はforeach文内でスキップするか、
hashrefメソッド内でうまく加工するか・・・
Perlのオブジェクトは厳格性に欠けるからなぁ〜・・・
>>493
うんそうだね。一応「評価」と書かずに「解釈」と書いたのだが、言葉たらずだね。

my($hoge, $abc) = '';

の初期化の意味の説明のために>>481を書いただけだから。
たしかに知らない人には誤解を与えるね。正直スマンかった。

正確には、配列、スライス及び、リストにスカラを代入すると
配列の先頭要素、スライスの先頭要素、リストの先頭変数にのみ
スカラの値が代入され、配列の要素数は、1になり、
スライスの残りの要素、または、リストの残りの変数には
未定義値がセットされる。
496デフォルトの名無しさん:04/08/17 01:27
つか、配列とリストってどう違うの?
同じ?
497デフォルトの名無しさん:04/08/17 01:29
>>496
リストは配列と違って要素の型が全て同じとは限らない。
配列の場合
@var = ('A', 'B', 'C');
@var = 'X';
print join(":",@var);
出力結果
X

スライスの場合
@var = ('A', 'B', 'C');
@var[0,1,2] = 'X';
print join(":",@var);
出力結果
X::

リストの場合
@var = ('A', 'B', 'C');
($var[0],$var[1],$var[2]) = 'X';
print join(":",@var);
出力結果
X::

配列とスカラの混合リストにリストを代入(1)
($var1,@var2) = ('A', 'B', 'C');
print join(":",$var1,@var2);
出力結果
A:B:C

配列とスカラの混合リストにリストを代入(2)
(@var2,$var1) = ('A', 'B', 'C');
print join(":",$var1,@var2);
出力結果
:A:B:C
>>489
>通常オブジェクトのメンバ変数にアクセスするには、アクセスメソッドを通して行いますが

と言っておきながら、

>$hashref->{$_} =~ s/.//g foreach keys %$hashref;

で思いっきりメンバ変数をダイレクトに操作している。

このアクセス方法を行う限り、リファレンスがどうのいうまえにOOPとして破綻する。
>>494が言っている通りPerlはオブジェクトに対する厳格性は求めていないので
実装する側がポリシーを持って、インターフェースを実装するしかない。

メンバ変数の内容を書き換えたくなかったらアクセスメソッドを作りなさいということ。
ちなみに>>489の例題は、

> my $test = { hoge=>1,hage=>2 };

で生成されたハッシュリファレンスをHogeオブジェクトに渡して、それを操作しているので
別Hogeオブジェクトを生成しても渡すハッシュリファレンスが同じものであれば
同じ内容を操作するわけだからオブジェクト間でいつでも値を壊してしまう恐れがある。

>bless { hashref=>$hashref },$self;

の部分を

bless { hashref=>{%$hashref}},$self;

とするだけで、コンストラクタで受け取った先の内容を気にする必要がなくなる。
ただ、>>489のやりたいことを理解していないので全然検討はずれのことを言っているかも。
OOの勉強したいんだったら、PerlでOOするべきじゃない
502489:04/08/17 16:03
>>499
アクセスメソッドはちゃんと通してますよ?
アクセスメソッドから得たものに置換処理しただけです。
>$hashref->{$_} =~ s/.//g foreach keys %$hashref;
通常直接いじるとは
$obj->{hashref}{$_} =~ a/.//g foreach keys %{$obj->{hashref}};
のようなことを言うんですが・・・・・勘違いされただけですよね?

>>500
なぜリファレンスにこだわったかというと、リファレンスはデリファレンスしない限り、
中身がどんなバイト数でも、処理時間に差は出ないですよね?まあPerlで処理効率とか速度とか言うな!って起こられそうですが;

やはり参照渡しはいいとしても、渡されたリファレンスを直接いじってそのまま返すようなことは
よくないですね。ありがとうございました。

とりあえずリファレンスは使い方を気をつけます。
リファレンスはコピーは速いけどアクセスは遅いですよ。
504489:04/08/17 16:28
>>503
それはデリファレンスする分だけ遅くなるってことですか?
気づきませんでした;ベンチとればよかたですね。
細かな書き方で効率にこだわる奴に限ってそもそも
全体のアルゴリズムがなってなかったりしがち
だから気をつけろよ
506デフォルトの名無しさん:04/08/17 16:50
なんか疑問があんだけど
メソッドからの返りがリファレンス変数である限り、異なる名前空間の変数に影響を与えることに
なるよね。↓でもしない限り。

my %test = %{\($obj->hashref())};

でもこんなことしてたら返りをリファレンスにする意味ないよね?なんかおかしくないか?
それともオブジェクトのプロパティにあたる変数だけを守ってれば他は、リファレンス返しして
受け取った相手がそのリファレンスの中身を書き換えてもいいのか?

ん〜PERLならではの悩みなのかこれは?
>>509
>>489のアクセスメソッド
sub hashref{
my $self =shift;
%{$self->{hashref}} = ( @_ ) if ($_[0]);
return $self->{hashref};
}

sub hashref{
my $self =shift;
%{$self->{hashref}} = ( @_ ) if ($_[0]);
my $value = {%{$self->{hashref}};
return $value;
}
って書き換えてオブジェクトメンバだけ壊さなければいいんじゃん?
508506:04/08/17 17:35
>>507
いいのかそれは?それじゃあオブジェクトメソッドのhashrefのローカル変数である
$valueの参照先が安全でないし、それならいっそ
sub hashref{
my $self =shift;
%{$self->{hashref}} = ( @_ ) if ($_[0]);
return %{$self->{hashref}};
}
でいいだろ。なんかリファレンス自体使うなって気がするが、DBIとかは普通にリファレンスで返して来るんだよな。
で、このスレでの結論は?
置換前の値をメモリーに入れたまま
置換後の値もメモリーに入れるんだろ?
どこかでコピーするしかねーじゃん。
04/08/17 18:09
を、
04/Aug/17 18:09

のように出力したい場合、月の部分をいちいち
Jan, Feb, Mar.... と記述しないとダメですか?(y/n)

# $jikan = localtime(time);
# print $jikan;
# とすると、
# Wed Apr 10 18:09:21 2002
# と出力されるので、上記のような面倒なことをしなくて済みそうなんですが・・・
>>510
なら初めからリファレンス使うなよ。
>>509
メソッドやルーチンにはリファレンスで渡すな。返りもリファレンスにするな。
というのがこのスレの結論。
>>511
いろいろやり方はあるが、とりあえずPOSIXモジュールの
strftime使うのをお勧めしておく。
>>489
Perlで禁止されてることなど何1つないよ。
PerlはC++やJavaみたいに言語仕様でOOPを支援してくれる部分が少ないから、
489のような問題のあるコードは書かないように自分で気をつけるしかないわけ。
もちろん、それが必要なら別だけど。

まず、mainパッケージの$testをそのままプロパティにしないで、コピーを
保持するようにする。
sub new {
  my ($class, $hashref) = @_;
  bless { hashref => {%$hashref} }, $class;
}
515514:04/08/17 19:57
で、hashrefの内容が壊されてはまずいのなら、ここでもコピーを返すか、
指定されたキーの値だけを返すようにする。
sub hashref {
  my $self = shift;

  # パラメタなければ、丸ごとコピーを返す(値にリファがあるケースはとりあえず無視)
  if (@_ == 0) { return %{$self->{hashref}} }

  # パラメタ1つの時、
  elsif (@_ == 1) {
    # ハッシュリファなら、丸ごと交換
    if (ref($_[0]) eq 'HASH') { $self->{hashref} = {%{$_[0]}} }

    # それ以外はキーとみなし、値を返す
    else { return $self->{hashref}->{$_[0]} }
  }

  # パラメタ複数なら、hashrefに値を設定(指定されたキーのみ)
  else {
    while (my($key,$val) = splice(@_,0,2)) {
      $self->{hashref}->{$key} = $val;
    }
  }
}
516デフォルトの名無しさん:04/08/17 20:11
>>508
>DBIとかは普通にリファレンスで返して来るんだよな。

DBIがリファで返してくるのはプロパティじゃないだろが。
一時的に生成された無名配列や無名ハッシュだったら、
返しても全く問題ない。
517デフォルトの名無しさん:04/08/17 22:46
http://com.80code.com/index.html
サイゾウで公開されてるやつをつかって
自分のHPに画像掲示板設置してみたんですが
なんかこの掲示板何かを書き込んだ直後にページを更新すると
書き込んだやつを連続投稿しちゃうみたいです。
ページを更新しても連続投稿しないようにしたいんですが
どうにかなりませんか?
どなたかアドバイスを。。
(当方一応perlの基本的な部分はわかってます。)
>>514-6
とりあえずコピーしたりするなら初めからリファレンスで渡さないほうがわかりやすくていいだろ?
まずリファレンスってのは名前空間をある意味で超えてる存在だから厄介なんだよな(OOP時には注意)。

無名ハッシュのリファレンスだろうがなんだろうが、他の名前空間で作られたリファレンスを
リファレンスのまま返して、返し先でデリファレンスして処理を行えば、名前空間を越えて
影響がでる。本当に拡張的なプログラムにするのにそれは好ましいとは思えない。

厳格にOOをするのなら異なるオブジェクト間での、値の受け渡しにリファレンスは使わないという
ルールを作ったほうがいいと思う。ただ、そこまで厳格なものにしたいならPerlで書かなくてもいいんじゃないか?
ってことで適当にPerlなりの柔軟さを生かすのが賢いだろうね。
>>517
無名変数は安全だよ。ちゃんと元のデータを壊されることのないようなコーディングにすれば
大丈夫さ。
520デフォルトの名無しさん:04/08/17 23:47
パールってプログラム言語と考えてよいのでしょうか?

パールはシェルと呼ばれているようですが、

C++をシェルと呼ばないのはなぜなんでしょうか?

いまいち、パールの位置づけが理解できない・・・・・・・・・・・
>>520
ぱーるハ、いんたーぷりたー
>>520
シェルなんて呼ばれてんだ?
>>521
完全なインタープリタじゃないけどな
524デフォルトの名無しさん:04/08/18 00:24
>>523
パールはコンパイラってこと?
525デフォルトの名無しさん:04/08/18 00:30
真珠なくて?
>>524
@INCへ自作モジュールの場所をlibを使わずに追加するときを考えればわかるだろ。
>>518は名前空間とメモリ領域の区別ができないらしいな。
他の名前空間で作られたリファレンスって何よ?
変数名の管理のための名前空間とメモリ領域に関するリファレンスを
同じ土俵で考えること自体ナンセンス。
名前空間を越えて影響がでるとか言ってる時点で終わってる。
プログラムで扱われるメモリ領域が、複数の名前空間の
関数などで利用されることには何の問題もないし至って普通。
>>527
OOPでメモリ領域を考える事がナンセンスだと思うんだが。
横槍スマソ
>>528
527は名前空間とリファレンスを同じレベルで考えることの
無意味さを説いているのでは?
489は設計の問題であって、名前空間がどうのって問題じゃあ
ないのは確か。
>>520
>パールはシェルと呼ばれているようですが、
違う。パールは普通シェルの中に入ってる
>>530
うまい…
うまいなあ。
533デフォルトの名無しさん:04/08/18 09:33
それで、オブジェクト間での値の受け渡しにリファレンスを使うメリットはあるって結論でいい?
534デフォルトの名無しさん:04/08/18 09:52
>>530
やっと意味わかった。。。なぞなぞみたい。
パールと言えば御木本幸吉
536デフォルトの名無しさん:04/08/18 10:25
>>527
>プログラムで扱われるメモリ領域が、複数の名前空間の
>関数などで利用されることには何の問題もないし至って普通。

その言い方だと>>489のコーディングで、オブジェクトのプロパティを壊しても
何の問題もないってことになるな。実際オブジェクトのプロパティはアドレスであって
その中身であるとは限らないからな。

ていうかお前ネタだろ?
>>530
名言!テンプレにでも入れたいよ。
>>530>>531>>532>>537
自演って面白いか?
アホだろお前
('A`)オチケツ
>>538
ラリーのジョーク程度には面白いと思うけどな。

それを面白いと言うかどうかは個々人に任せるが(w
何かキモイのが来てるんだな・・・
まあPerlなんて使ってる香具師ほとんどいないしな
>>536>>527の続きが気になるんだが・・・・・
どっちが正しいんだよ!俺にもわかりやすく説明しやがれ!!!
パールの問題は1問目、2問目というように問目で数える。
はないちもんめ
546デフォルトの名無しさん:04/08/18 17:47
パールのようなもの
著しくガイシュツ
>>543
漏れも気になってたんだが、536の
> ていうかお前ネタだろ?
ってどゆ意味?
549デフォルトの名無しさん:04/08/18 18:41
>>548
多分
冗談で言ってるんだろ?
とかいう感じじゃないか?っていうか漏れは最近Webpg板から写ってきたんだが、
こっちの方がレベルの低い気がしてがっかり;

向こうは結構ちゃんとした回答者が常にいるのに。こっちは中途半端な知識の集まりって感じだねorz
もちろん漏れもその一人だけどさ;
>>550
それってさげろって言ってるの?それとも>>549にアフォって言ってるの?
552デフォルトの名無しさん:04/08/18 23:18
どう考えても後者だろ


上げるなアフォ
>>549
俺はWebの話し合いのレベルがあまりに低いんでこっちに移った。
俺がWeb板にいてた頃・・・って1年ほど前だけど。
そりゃひどかった記憶が・・・_| ̄|○
ここもかなりのものだ
まあどっちもどっちだな。
557デフォルトの名無しさん:04/08/19 00:14
549はパンチ5分の3とか言ってコピペで荒らしていた奴だろ。
まぁこっちの板からしてみりゃPerlなんて片手間のツールで、
居着いてまじめに回答しようって奴もそりゃ少ないだろうな。

そもそもPerlなんて、よほどのアホであるか、めちゃくちゃ濃い疑問を持たない限り
「他人に質問しなきゃならない事態」にならないだろ。
>>558
阿っ蘇
>>559
雲素
向こうはCGIしかできません( ´,_ゝ`)プッ
アップロードCGIの勉強をしようと思い、KENTのCLIPBOARDのコードを見てたら

# マックバイナリ対策
if ($macbin) {
$length = substr($upfile,83,4);
$length = unpack("%N",$length);
$upfile = substr($upfile,128,$length);
}

と言うのがあり、さっぱり意味が分かりません。
ググっても明確な答えを見出せませんでした。
どなたかご存知の方、おりますでしょうか
>>562
ここがわかりやすいと思う。

ttp://homepage1.nifty.com/glass/tom_neko/web/web_05.html

これを読んでなおそのコードの意味がわからないようなら
決定的に勉強不足なので、わかる日がくるまで精進するしか
ないな。
564562:04/08/19 16:26
>>563さん回答ありがとうございます。
おー
なるほど。良く分かりました。
コードの意味は分かります(^^;)
565デフォルトの名無しさん:04/08/19 20:00
ハッシュのキーの数を表示したくて
print ($_=(keys(%a)));
のようにしたんですが、もっとシンプルな方法ありますか?
>>565
タイプは増えるけど
print scalar keys %a;
とか
567565:04/08/19 21:10
>>566
ありがとうございます。
scalarなんてのがあるんですね。まさに求めていたものです。
ところで、
print ($_=(keys(%a)));
ってやるとなんでkeysのスカラー値が表示されるのでしょうか?
>>567
perldoc -f keys くらい調べてくれよ。

> (In scalar context, returns the number of keys.)
>>566 のタイプ数を少し減らして

print 0+keys %a;

スカラー評価。


>>567
keys はリストを返すが、リストをスカラー評価すると
リストの要素数が得られる。
$_ = ってのは、右辺をスカラー評価ね。
570567:04/08/19 21:35
>>568
keys関数をスカラーで評価するとキーの数が返ってくることは知ってます。
なので最初は、
$_=keys(%a);
print $_;
ってやってました。
んで試しに括弧で括ってみたら出来たわけですが、
($_=keys(%a))
でスカラー値が返ってくる仕組みが知りたいのです。
571デフォルトの名無しさん:04/08/19 21:54
パールでオブジェクト指向できますか?
終わってます
>>570
何を知りたいのか分からんが
$a = $b = 5; とか print ($a=5); を不思議に思う人かい?

# 良い子は $a とか $b なんて変数名を使う習慣を身に付けちゃダメだぞ
>>571
オブジェクト指向の基本をしってるやつなら、Perlでもできる。
まあ何のためのオブジェクト指向かを勉強しれ。

簡単に言うと、賢いやつは何をやらしてもなかなかの結果を出すってことだ。
575デフォルトの名無しさん:04/08/19 23:35
>>574
なるほど、おまいが結果を出せないわけが良く分かったよw
576デフォルトの名無しさん:04/08/19 23:36
>>575
同意
自作自演まで三流かよ!
>>570
> んで試しに括弧で括ってみたら出来たわけですが、
> ($_=keys(%a))
> でスカラー値が返ってくる仕組みが知りたいのです。

$_ = ...
の「式の値」は、$_ に代入された値になる。で、
print に渡されるのは、その式の値。

ちなみに、今回のケースでは括弧はなくても大丈夫。

print $_ = keys %a;
喪舞らレベル高いなぁ
関心するよ
580デフォルトの名無しさん:04/08/20 10:51
だってヲタクですから!!!
残念
質問スレでレベル云々言われてもなぁ。
MSN Messenger APIの仕様書どこかおせーて
少なくともスレ違いだと思います
質問します。

現在、PerlにてCGIを作成しているのですが、
オープンしたファイルに書き込みが出来なくて困っています。
セキュリティーに関してはちょっと置いといて、
Perlソース(一部分)はこちらです。

$dot_qmail_path = "/home/$user_name/.qmail";
if ( -r "$dot_qmail_path" && -w "$dot_qmail_path" ) {
open( QMAIL , ">>$dot_qmail_path" ) || &Error_Print('09',$!);
print QMAIL "aaaaaaaaaa\n";
close(QMAIL);
}

CGIフォームにてユーザーから、$user_nameを受け取り、
その$user_nameユーザーの.qmailファイルに追記したいのです。

ここで、$dot_qmail_path に "/home/$user_name/.qmail" を代入するとNGで
$dot_qmail_path に 直接 "/home/hogehoge/.qmail" と変数を利用しないパスだときちんと
該当ファイルに追記してくれるのです。

変数が2重になっていると変数を展開しないなんて事はないですよね?

print "$dot_qmail_path";
とするときちんとパスは"/home/hogehoge/.qmail"と表示されるんですがね。。。

ちなみに。
/home/hogehoge/.qmail のパーミッションは644のオーナーhogehoge、グループhogehogeになっています。

このCGIのパーミッションは4755のオーナーroot、グループrootです。
(今はセキュリティーは無視しています)
585デフォルトの名無しさん:04/08/20 21:24
>>584
4755だとするとに$user_nameが汚染されてんじゃねーの?
>>584
$dot_qmail_path = '/home/' . $user_name . '/.qmail';
したらどう?
>>584
バカじゃん
なにがどうNGなんだろね。
tu-ka、.qmail 書き換えるときはスティッキ立てろって書いてあるし、4755 root:root の CGI ってまさしく >>587 の通りだし。

CGI から特定のデータを一旦ファイルに書き出して、書き出したファイル群を巡視する daemon 設置してそちらで .qmail 書き換えるべきだよな。@要root、setuidgid プログラム
>>588
訂正m(_ _)m
書き出したファイル群を巡視するプログラムを svscan でまわしてそちらで .qmail 書き換えるべきだよな。@要root、setuidgid プログラム
590デフォルトの名無しさん:04/08/20 22:10
591570:04/08/20 22:14
>>578
遅レススマソ。
その説明で納得いきました。ありがとうございます。
592デフォルトの名無しさん:04/08/20 22:30
Effective Perlってどう?
古い?
593584:04/08/20 23:27
もしかすると、
>>585
>>587
>>589の意図するところは

>>586 ちなみにダメでした。


汚染モードで実行されて、$user_nameのところで、
汚染チェックされ、プログラムが終了してしまっている。

ということでしょうか?

>>588 ちなみに、.qmailでなくても、通常のファイルでもダメですが、

4755 root:root の CGI ってまさしく >>587 の通りだし。

これはセキュリティー上のことですか?
それとも汚染モードってことですか?
>>584見て一発で分かったぜ。
ヒントは3つ。

> 現在、PerlにてCGIを作成しているのですが、

> ここで、$dot_qmail_path に "/home/$user_name/.qmail" を代入するとNGで
> $dot_qmail_path に 直接 "/home/hogehoge/.qmail" と変数を利用しないパスだときちんと
> 該当ファイルに追記してくれるのです。

> print "$dot_qmail_path";
> とするときちんとパスは"/home/hogehoge/.qmail"と表示されるんですがね。。。


if ($user_name eq 'hogehoge') {
  print '合ってる';
} else {
  print '間違ってる';
}

これやってみ。
あと、print "$dot_qmail_path";をログファイルに書き出すようにしてみ。
595584:04/08/21 00:28
さっそくやってみますた。

$dot_qmail_path = "/home/$user_name/.qmail";
print "$dot_qmail_path" . "<BR>";
if ($user_name eq 'hogehoge') {
print '合ってる<BR>';
} else {
print '間違ってる<BR>';
}
if ( -r "$dot_qmail_path" && -w "$dot_qmail_path" ) {
open( QMAIL , ">>$dot_qmail_path" ) || &Error_Print('09',$!);
print QMAIL "aaaaaaaaaa\n";
close(QMAIL);
print 'ここまできてる?<BR>';
}

と、してみたところ、

ブラウザには
/home/hogehoge/.qmail
合ってる

と出たので、ユーザー名、パスに誤りはないと思います。

さいごのprint文の「ここまできてる?」
はブラウザに表示されませんでした。

ちなみに、このcgiのパーミッションを4755としているのには、/etc/shadowファイルを
オープンさせるために、「とりあえず」、このようにしています。

あと、変数名にセンスが感じられないのはご愛嬌でお願いします。
>>595
ありゃ?俺はてっきり$user_nameの頭か尻に空白類文字が入ってんのかと思った。
「合ってる」が出るってことは合ってんだろうな。
本当に
$dot_qmail_path = "/home/$user_name/.qmail";

$dot_qmail_path = "/home/hogehoge/.qmail";
に変えたらうまく行くんだろうな?
if ( -r "home/$user_name/.qmail" && -w "home/$user_name/.qmail" ) {
  print "ok";
}
if ( -r "home/hogehoge/.qmail" && -w "home/hogehoge/.qmail" ) {
  print "ok";
}
これを
if ( -r "$dot_qmail_path" && -w "$dot_qmail_path" ) {
の前に入れてみろ。okが2つでなかったらアウトだ。
間違いないね。
それで俺もこまってるんだもの。

一応、$user_nameはなんちゃって正規表現で、チェックはしているつもり、
コレでも汚染は取れきれないのかな?
ドットとスラッシュ許可してるからな・・・


sub Address_Check {
@addresss = ("$user_name" , "$tenso_address_1" , "$tenso_address_2");
foreach $buf (@addresss) {
if ( $buf =~ /[^\w.\-\/\@]/ ) {
&Error_Print('00',$buf);
} elsif ( $buf eq "" ) {
&Error_Print('01',$buf);
}
}
}

はたして、この正規表現であってるかはわからんが・・・・

要はやりたいことは
CGIフォームで転送アドレスを受け取って、それを.qmailに追記したいのよ。
ユーザーの認証は、すでに持っているアドレス(@より前の部分)とメールパスワード
で認証させる。ってことで、

全部のソース載せてもいいんだけど、載せきれないしね。
>>598
違うだろ。
同じ(はずの)文字列に対して同じ(はずの)処理をしているのに違う結果になるのが問題であって、
汚染とか全然関係ない。

ちなみに汚染をtaint mode(-T)のこととして言ってるなら、
> コレでも汚染は取れきれないのかな?
> ドットとスラッシュ許可してるからな・・・
taint modeはそういうものじゃない。
>>597

非常に残念な結果が出てしまいました。

$dot_qmail_path = "/home/$user_name/.qmail";
print "$dot_qmail_path" . "<BR>";
if ($user_name eq 'hogehoge') {
print '合ってる<BR>';
} else {
print '間違ってる<BR>';
}
if ( -r "/home/$user_name/\.qmail" && -w "/home/$user_name/\.qmail" ) {
print "ok";
}
if ( -r "/home/hogehoge/\.qmail" && -w "/home/hogehoge/\.qmail" ) {
print "ok";
}
if ( -r "$dot_qmail_path" && -w "$dot_qmail_path" ) {
open( QMAIL , ">>$dot_qmail_path" ) || &Error_Print('09',$!);
print QMAIL "aaaaaaaaaa\n";
close(QMAIL);
print 'ここまできてる?<BR>';
}

え〜っと、いちおうhome/$user_name/.qmailとあったので、念のため/home/$user_name/\.qmailと変更しました。

結果、
/home/hogehoge/aaaaa
合ってる
okok

このブラウザだけ見ると、やけにうまくいってそうなメッセージだな。でもね、でもね、「ここまできてる」の文が出ないのが、俺にはどうにも不思議で不思議で・・・
601600:04/08/21 00:54
ふと、気づいたんだが、
確かに /usr/bin/perl -Tで汚染モードに入るのはわかる。

でも、setuidにしているので、自動的に汚染モードで動きません?
何かもうわけわからんな。
1.
print "/home/$user_name/\.qmail";
print "/home/hogehoge/\.qmail";
print "$dot_qmail_path";
をして、3つの出力をブラウザのソース表示で全て同じであることを確認

2.
A. if ( -r "$dot_qmail_path" && -w "$dot_qmail_path" ) {
B. if ( -r "/home/$user_name/.qmail" && -w "/home/$user_name/.qmail" ) {
C. if ( -r "/home/hogehoge/.qmail" && -w "/home/hogehoge/.qmail" ) {

の3種類を試してみて、本当に「C.だけが成功する」のかどうか確かめる。

3.
「実はうまくいってるのに、うまくいってないと勘違いしてるのでは?」等を疑う。
エラーログを見るべきだと思うね。
604600:04/08/21 01:09
>>602

わけわからなくなるでしょ?

ちなみにね、
1.だけど、
やっぱりブラウザのソース見たけど一緒だし、
2.も
ABはだめ、Cはイケルって結果だね。
3.は2.のCがうまくいっているのを確認したし、2.のA,Bが失敗しているのは完全によくわかる。

全ソースさらけだすか?

ちなみに自分が作ったスクリプトって見られるの恥ずかしくネ?
気になって眠れないから見たい。
>>598
汚染はマッチしただけじゃ取れないよ。
(...)を含んだ正規表現とマッチさせて
$1, $2, ...で部分文字列として
取り出さないとだめ。perlsecをよく
読め。
607デフォルトの名無しさん:04/08/21 01:15
>>603

あ!!ゴメン。エラーログになんか出てた。

Insecure dependency in open while running setuid at /var/www/cgi-bin/trans.cgi line 60.

だって、ちょっと手元にあるプログラミングPerl VOLUME2で調べたら、

Insecure dependency in %s
(%sは安全でないものに依存している)

(F)汚染チェック機能が嫌うようなことを行おうとした。汚染チェック機能は、setuidや
setgidで実行した場合、および-Tスイッチによって陽に設定した場合に有効になる。汚染
チェック機能は、ユーザーを信頼できない人物とみなして、直接または間接的にユーザーから
与えられたすべてのデータに印をつける。もしそのようなデータが「危険性のある」走査
で使われると、このエラーが発生する。

だって。
ちょっと見えてきたわ。。。
608デフォルトの名無しさん:04/08/21 01:20
ちなみに

line 60はやっぱり、

open( QMAIL , ">>$dot_qmail_path" ) || &Error_Print('09',$!);

だったよ。
>>607
いやだから最初から585がそう言ってるだろ...
Perlってホント汚いソースになるなぁ
611600:04/08/21 01:55
>>609
そうねそうだよね。

>>610
俺が汚いだけだよ。
perlは汚くないよ
612 ◆6o5lxU9TxQ :04/08/21 02:20
回答頂ければ幸いです。

ttp://www.saitaniya.jp/hide/perl06.html
のようにエラーが出てしまい、此処での対策はjperlで回避していますが
それ以外の方法ありましたらご教授下さい。
ソースやデータの文字コードは?
ActivePerlで正常に動作する組み合わせもあると思う。
5.8以降使えよ
615デフォルトの名無しさん:04/08/21 05:20
5.8って
/あ[いう]/
なんて正規表現もOK?
5.8以降使えよ

と俺も思うが。

サブルーチンを一個作って解決する方法もある。
引数に$str1とかを取って、1バイトずつスキャンして
[の前に\を挿入するサブルーチン。

正規表現のパターンに変数を突っ込む前にそのサブルーチンで変換する。

$a =~ /&hoge($str1)/; とかできたっけ?

$a =~ s/(...)/&hoge($1)/; はできたような記憶がかすかにあるが。
UTF-8で書けばOKなんじゃないの?
>>615
それがUNICODEなら当然出来るでしょ。
UTF-8で書いて
先頭でuse utf8;すればできるよ
>>612
my $str1 = "サービス";
my $str2 = "サービス期間";
print "match\n" if( $str2 =~ /\Q$str1\E/);
perl6になったら正規表現もperl5から変化するんですか?
Shift-JISテキストを正しく扱う
http://homepage1.nifty.com/nomenclator/perl/shiftjis.htm

まあここでも最初に5.8以降使えよと書いてるわけだが
>>616
> サブルーチンを一個作って解決する方法もある。
sub quotemetaのことだね:-)
>>592
本自体は古いけど、内容は今でも余裕で使えるから買って良し。
625 ◆6o5lxU9TxQ :04/08/22 01:34
回答して頂いた方々、ありがとうございました。
参考にして問題を回避してみます。

ソースはttp://www.saitaniya.jp/hide/perl06.htmlの問題と同じです
文字コードはシフトJIS、Perl 5.8.*は 自分のサーバーなら出来ますが
無料スペースとなると難しいと思われます。
ども、明日あたり書店で目を通してきます。
文体とかが気に入るといいな。
jperlは入れられるのにPerl 5.8以降はだめってワケワカンネ
628デフォルトの名無しさん:04/08/22 03:04
ワケワカンネ
のはおめーだよ
あっそ
5.8以前のPerlなんてまともにつかったことないんだけど、
変な作法覚える価値ある?use encodingがもう当たり前な
感じなんだけど。
むしろ5.8のユニコードまわりをおぼえる価値が
あるかどうか知りたい。ライブラリの対応状況も
いまいち見えないし、なんかめんどくさいだけ
のようにも見えるのだが(笑)
つーか動けばどっちでもいいよ
>>631
ほぼない。使うならjperl。
ただし、jperlのバグにはまるとけっこう困る。
635デフォルトの名無しさん:04/08/22 12:29
5.8より前のバージョンしかインストールしていない奴はさっさとバージョンアップしろ。
5.8重い
3で充分
>>637
神(w
639デフォルトの名無しさん:04/08/22 14:45
perlで
置換したい文字列「aaaaaa」
置換後の文字列「bbbbbb」
として、このとき偶数回目にマッチした文字列のみ
文字置換を行いたい場合どう書いたらいいですか?
640黒死犬 ◆EgxBlf8nvc :04/08/22 15:01
my $match = "unko"; # 痴漢したい文字列

s/($match.*?)$match/${1}manko/go;
とか、

my $i = 0;
s/$match/($i++ % 2)? $match: "manko"/oge;
#!/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{
&nbsp;&nbsp;"([^\"]+)",?
&nbsp;&nbsp;|([^,]+),?
&nbsp;&nbsp;|,
}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/

おつんつん