Perlについての質問箱 28箱目
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2006/10/31(火) 14:52:21"There's more than one way to do it" ということで、Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板 http://pc8.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするのでWEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html
● 2006/10/31現在の最新版: 5.8.8
● 2006/10/31現在の開発版: 5.9.3
前スレ
Perlについての質問箱 27箱目
http://pc8.2ch.net/test/read.cgi/tech/1157874614/
リンク集は>>2-3
過去スレは>>4
0002デフォルトの名無しさん
2006/10/31(火) 14:53:20Perlプログラミング講座: http://www.site-cooler.com/kwl/perl/
[本]
リャマ: http://www.oreilly.co.jp/books/4873111269/
駱駝: http://www.oreilly.co.jp/books/4873110963/
Effective Perl: http://www.ascii.co.jp/books/detail/4-7561/4-7561-3057-7.html
クックブック: http://www.oreilly.co.jp/books/4873112028/
[オンラインマニュアル] (追加)
最新のドキュメント: http://search.cpan.org/~nwclark/perl-5.8.8/
perl5.8.xのドキュメント(一部): http://www.kt.rim.or.jp/~kbk/perl-5.8/
perl5.005_03 のドキュメント: http://www.kt.rim.or.jp/~kbk/perl5.005/
日本語ドキュメント検索: http://www.cpan.jp/search.cgi
perldoc.jp: http://www.perldoc.jp/
Perldoc.com: http://www.perldoc.com/
0003デフォルトの名無しさん
2006/10/31(火) 14:54:50[モジュール]
CPAN.com: http://search.cpan.org/
河馬屋二千年堂: http://homepage3.nifty.com/hippo2000/
[テクニック]
Perlメモ: http://www.din.or.jp/~ohzaki/perl.htm
Perlのページ: http://homepage1.nifty.com/nomenclator/perl/
Perlの小技: http://homepage3.nifty.com/hippo2000/perltips/index.htm
[Perl5.8Unicodeメモ]
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
http://www.namazu.org/~tsuchiya/perl/perl-5.8.html
http://www.lr.pi.titech.ac.jp/~abekawa/perl/perl_unicode.html
0004デフォルトの名無しさん
2006/10/31(火) 14:55:481 ttp://pc.2ch.net/tech/kako/1017/10177/1017736187.html
2 ttp://pc3.2ch.net/tech/kako/1033/10336/1033688230.html
3 ttp://pc2.2ch.net/tech/kako/1041/10412/1041205885.html
4 ttp://pc2.2ch.net/tech/kako/1048/10485/1048519394.html
5 ttp://pc5.2ch.net/tech/kako/1053/10530/1053053082.html
6 ttp://pc5.2ch.net/tech/kako/1060/10606/1060689008.html
7 ttp://pc2.2ch.net/test/read.cgi/tech/1068051036/
8 ttp://pc2.2ch.net/test/read.cgi/tech/1074151549/
9 ttp://pc5.2ch.net/test/read.cgi/tech/1079114157/
10 ttp://pc5.2ch.net/test/read.cgi/tech/1085564875/
11 ttp://pc5.2ch.net/test/read.cgi/tech/1090889189/
12 ttp://pc5.2ch.net/test/read.cgi/tech/1094579428/
13 ttp://pc5.2ch.net/test/read.cgi/tech/1097851764/
14 ttp://pc5.2ch.net/test/read.cgi/tech/1101649274/
15 ttp://pc5.2ch.net/test/read.cgi/tech/1105953092/
16 ttp://pc8.2ch.net/test/read.cgi/tech/1111034732/
17 ttp://pc8.2ch.net/test/read.cgi/tech/1117870308/
18 ttp://pc8.2ch.net/test/read.cgi/tech/1121804136/
19 ttp://pc8.2ch.net/test/read.cgi/tech/1126977805/
20 ttp://pc8.2ch.net/test/read.cgi/tech/1131286411/
21 ttp://pc8.2ch.net/test/read.cgi/tech/1134327348/
22 ttp://pc8.2ch.net/test/read.cgi/tech/1138519327/
23 ttp://pc8.2ch.net/test/read.cgi/tech/1141742901/
24 ttp://pc8.2ch.net/test/read.cgi/tech/1146022352/
25 ttp://pc8.2ch.net/test/read.cgi/tech/1149259409/
26 ttp://pc8.2ch.net/test/read.cgi/tech/1153412251/
27 ttp://pc8.2ch.net/test/read.cgi/tech/1157874614/
0005デフォルトの名無しさん
2006/10/31(火) 18:01:24>>1乙
0006デフォルトの名無しさん
2006/10/31(火) 18:12:14乙
罰ゲームで新スレたてて誰も慰みの言葉かけてくれなきゃ腐るわなw
0007デフォルトの名無しさん
2006/10/31(火) 22:02:46いまきただけだけどw
0008デフォルトの名無しさん
2006/10/31(火) 22:22:300009前スレ992
2006/11/01(水) 00:18:14それは遅いと思い込んでいました。ありがとうございました。
0010デフォルトの名無しさん
2006/11/01(水) 00:19:20好みによるだろうけど(´・ω・)
my (@head, @body);
while (<FH>) { push @head, $_; last if /^$/m; }
while (<FH>) { push @body, $_; }
0011デフォルトの名無しさん
2006/11/01(水) 00:23:09while (<FH>) { (/^$/) ? last : push @head, $_ }
while (<FH>) { push @body, $_ }
メールの処理かね。
0012デフォルトの名無しさん
2006/11/01(水) 00:50:04(/^$/ .. 0) ? push @body, $_ : push @head, $_ while (<FH>);
0013前スレ992
2006/11/01(水) 00:56:520014デフォルトの名無しさん
2006/11/01(水) 01:02:40つ「Win32-IE-Mechanize」
http://search.cpan.org/~abeltje/Win32-IE-Mechanize-0.009/lib/Win32/IE/Mechanize.pm
0015デフォルトの名無しさん
2006/11/01(水) 01:03:39local $/ = "\n\n";
push @retsu, <FH>;
@hai = split /(\n)/, shift @retsu, -1;
# ネタなので効率とかは知らん
0016デフォルトの名無しさん
2006/11/01(水) 01:05:22誰ひとりベンチなんか計らずにポストしてると思うがなw
0017デフォルトの名無しさん
2006/11/01(水) 02:26:04while (<FH>) {/[^\s]/ ? push (@head,$_) : last;}
@body = <FH>;
0018デフォルトの名無しさん
2006/11/01(水) 02:39:50$file="tes.txt";
$outfile="k.txt";
open (IN, $file) or die "$!";
open (OUT, ">$outfile") or die "$!";
$file = ~s/ABC/XYZ/g;
print out $file = ~s/ABC/XYZ/g;
close (IN);
close (OUT);
全く意味わからんのですが、ファイルを開いてABCをXYZに検索置換してk.txtに保存って
どうやるのだろう
0019デフォルトの名無しさん
2006/11/01(水) 03:06:42>>2
0020デフォルトの名無しさん
2006/11/01(水) 03:23:062つの配列があって10%の確立でどっちかの配列を選ぶプログラムを書きたいんですが、
どうやればいいですか?
エロイ人お願いします。
0021デフォルトの名無しさん
2006/11/01(水) 03:38:23while (<TEXTFILE>) {
s/ABC/xyz/g;
print "$_\n";
}
こんな感じの物があった。
0022デフォルトの名無しさん
2006/11/01(水) 03:39:40日本語でおk
002321
2006/11/01(水) 03:56:31#!/Perl\bin\perl
$CSfile="CSfile.csv";
$TXfile="TXfile.txt";
$outfile="outfile.txt";
open (INTEXT, $TXfile) or die "$!";
open (INCSV, $CSfile) or die "$!";
open (OUT, ">$outfile") or die "$!";
while (<INCSV>) {
# 改行コードの除去
chomp ($_);
# 各行をカンマ区切りで分割
@data = split(/,/, $_);
while (<INTEXT>) {
s/$data[0]/$data[1]/g;
print OUT "$_";
}
}
# ファイルハンドルを閉じる
close(INTEXT);
close (INCSV);
close (OUT);
どこかヘンですか?
0024デフォルトの名無しさん
2006/11/01(水) 04:05:11まあ、上では while (<INTEXT>) { } は一回しか実行されないあたりとか大丈夫かな、っては思う。
0025デフォルトの名無しさん
2006/11/01(水) 04:11:42$TXfileを最初に全部読み込んどけ。
0026デフォルトの名無しさん
2006/11/01(水) 04:12:24あぁそれですねー
どうすれば、動くようになりますかね?
0027デフォルトの名無しさん
2006/11/01(水) 04:35:26どこに問題があるかは分かった?
INCSVを読んだあとINTEXTの置換に取りかかってて、そこまではまあ悪くない。
けどINCSVの1行目のループでINTEXTを最後まで読んじゃってるでしょう。
ファイルの読み書きにはファイルポインタっていう「しおり」みたいなのがあるのは理解してる?
INTEXTを最後まで読んじゃって「しおり」が最後にあるから、INCSVの2行目からの処理では
INTEXTを先頭から読めないじゃん?ってことね。
そのスクリプトの場合なら「しおり」であるファイルポインタを移動すりゃ思ったように動く。
頑張れ。
002821
2006/11/01(水) 04:44:02perlを始めて10時間。なかなか難しいですねぇ
もう少し、がんばってみます!!
0029デフォルトの名無しさん
2006/11/01(水) 04:48:06$outfile に ($TXfile の行数 * $CSfile の行数) 分のデータが書き込まれそうなんだが、
これはわかってやってるのかね?
って 10時間かよwww
003021
2006/11/01(水) 04:55:05ただ、検索置換したいだけなのに・・・・・
003120
2006/11/01(水) 05:19:11こういう感じにしてみた。$rateに何パーセントの確立で選ぶ値が入ります。例えば10とか20とか。
でもこれだと絶対にX%の確立で一方が選ばれないんだよね。
誤差が2−4%ぐらいでる。
何か言い方法ありませんか?
sub erabu{
my $rate = shift;
my $divider = $rate/10;
my $seed = 10/$divider;
my $randomInt = int(rand($seed));
if ( $randomInt == 0 )
{
return 0;
}
else
{
return 1;
}
}
0032デフォルトの名無しさん
2006/11/01(水) 05:50:410033デフォルトの名無しさん
2006/11/01(水) 06:31:46print文などを使って、変数の値を確認することを勧める
003421
2006/11/01(水) 06:54:580035デフォルトの名無しさん
2006/11/01(水) 07:33:46それは呪いだよ。
0036デフォルトの名無しさん
2006/11/01(水) 08:20:32$erabareta = 1 > rand 10;
・・・・しね
003721
2006/11/01(水) 08:50:01もうちょっと勉強してみる。
003820
2006/11/01(水) 09:15:34これ動かないんですが。
0039デフォルトの名無しさん
2006/11/01(水) 10:07:27アドレスとソースの取得はどのようにやればいいのでしょうか?
0040キューチャン
2006/11/01(水) 10:37:07手にいれるか知っている人いませんか? 教えてください
最新のものしかみつかりません
0041デフォルトの名無しさん
2006/11/01(水) 12:05:45質問スレなんだから問題ないと思うが。
0042デフォルトの名無しさん
2006/11/01(水) 12:13:25>>1
まぁいいじゃね?とは思うが。
0043デフォルトの名無しさん
2006/11/01(水) 12:20:190044デフォルトの名無しさん
2006/11/01(水) 14:15:17誰か解答教えて下さい。
ttp://www.ipc.hokusei.ac.jp/~z00104/semi/kadai4.html
0045デフォルトの名無しさん
2006/11/01(水) 14:35:450046デフォルトの名無しさん
2006/11/01(水) 15:03:01なんていうの?
0047デフォルトの名無しさん
2006/11/01(水) 17:54:320048デフォルトの名無しさん
2006/11/01(水) 17:56:03北星学園か。俺が昔かかわったことのある学校だなあ。
で、その5ってその手前で作ったのを変更して作れってことだよな?
変更する前のプログラムは作ったのか?
0049デフォルトの名無しさん
2006/11/01(水) 18:12:42これでよろしいでしょうか?
open(IN,"LIST.txt");
while( <IN> ) {
print $_ ; }
close (IN);
0050デフォルトの名無しさん
2006/11/01(水) 18:25:26追加モジュールをインスコしないとだめなんすね。回答ありがとうございました。
このくらい標準で入れといてほしいけどここで言ってもしょうがないか...
0051デフォルトの名無しさん
2006/11/01(水) 18:45:59それが4の答え? とするとそこからして間違いだと思うが。
まず4についてはね、ファイル開くのをいちいち自分で書く必要はなくて、
<>を使うと簡単。
@a = <>;
これだけで引数で指定したファイルまたはファイルを指定しなければ
標準入力からの入力が全部1行づつ @a に入る。文字列の数(行数)は
@a の数だ。これは @a を scalar として扱うだけでいい。これで
行数が出る。
print scalar(@a) . "\n";
で、@a の内容を全部表示するには
print @a;
でできる。
5はもう少し自分で考えろ。
0052デフォルトの名無しさん
2006/11/01(水) 22:16:51日本人だけが使ってるわけじゃないからね。
そもそもEncode関連はサイズ大きいから、必要としていない言語圏の方々からは嫌われてるとか聞いたこともあるし。
それにEncodeを使えば簡単にEncode::EUCJPMSみたいなのが作れるんだから、他言語よりはマシな気がする。
0053デフォルトの名無しさん
2006/11/01(水) 23:37:58行はいいのだが、列としてのあつかおうとすると
非常にめんどう(表計算ファイルとかのとき致命的)
たとえば2次元配列のリファレンス
$ref = ([ ],[ ], [ ])
があるとするとこれのそれぞれの
要素の第一成分を表示する
簡単な方法はないでしょうか?
print @{$・・@$ref->[0]};
といったかんじでできない?
005453
2006/11/01(水) 23:44:18簡単な方法は
foreach (@$ref){
print $$_[0];
}
ぐらいでもこれでもforeachとかかませて色々操作する必要がある
特に列間の計算とかすることになるとこれでは非常に
面倒
なにか一単語で簡潔にあらわせる方法があったはずなんだが・・・
おもいだせない
0055デフォルトの名無しさん
2006/11/02(木) 00:29:55005653
2006/11/02(木) 00:34:37ただ
@$\のくみあわせで
print @{$・・@$ref->[0]};
といったぐあいに(@{@$ref->[0]} みたいなかんじ)
で表現できたはずなんだ
どうしてもできない
おしえてほしい
0057デフォルトの名無しさん
2006/11/02(木) 02:20:21他人事ながら親切回答に感激
0058デフォルトの名無しさん
2006/11/02(木) 08:29:24perldoc perllol しても情報はないなぁ
> @part = @{ $AoA[4] } [ 7..12 ];
は単なる slice だし。
そういう方法があれば知りたいもんだ。
005921
2006/11/02(木) 08:49:43$CSfile="CSfile.csv";
$TXfile="TXfile.txt";
$outfile="outfile.txt";
open (INTEXT, $TXfile) or die "$!";
open (INCSV, $CSfile) or die "$!";
open (OUT, "> outfile.txt") or die "$!";
@lines = <INTEXT>;
$line_amount = @lines + 1; #行数計算
while (<INCSV>) {
chomp ($_);# 改行コードの除去
@data = split(/,/, $_);# 各行をカンマ区切りで分割
for($i=0;$i<$line_amount;$i++){
$lines[$i] =~ s/$data[0]/$data[1]/g;
}
}
print OUT @lines;
close(INTEXT);
close (INCSV);
close (OUT);
なんとなくできましたが、
速度が遅すぎる点と、結果が文字化けしている点がいかんともしがたい。
CSfile.csv=4万行以上・TXfile.txt=2万行程度(検索・置換は全て日本語です)
改善策をご指導ください。
0060デフォルトの名無しさん
2006/11/02(木) 09:16:50置換対象のファイルを@linesに行ごとに入れてループでまわすよりは
全体を一つの変数$linesにいれてまとめて置換した方がたぶん速い。
$lines = do { local $/; <INTEXT> };
文字化けの原因はここに書いてある情報だけではないともいえないが
たぶんEUCかSJISそのままでやってるせいじゃないかと思うので内部は
unicodeにしたほうがいいだろう。全部一緒ならopenプラグマで
use open ':encoding(sjis)';
のようにすればまとめて指定できるはず。
0061デフォルトの名無しさん
2006/11/02(木) 10:48:08どうもありがとう!やってみます!
006221
2006/11/02(木) 12:22:58文字化けは、解消されました。
速度については、速くはなったと思いますが、それでも遅い感じがします。
perlの限界なのかな・・・・
いろいろありがとうございました!
006321
2006/11/02(木) 12:59:25次はC言語でやってみたいと思います。
C言語も全くしたことないけど・・・・
速いのかな・・・・
0064デフォルトの名無しさん
2006/11/02(木) 13:22:15問題なのは行数よりサイズだと思うんだが・・・。
ってかそんな遅くなるとかどんなファイル扱ってんだよ('A`)
0065デフォルトの名無しさん
2006/11/02(木) 13:37:552万行の文字列を4万回置換だからそれなりに時間はかかるだろうな。
4万回s///するのと置換対象の文字列を全部 | でならべて
s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが
速いだろうか
あるいは発想を変えて、対応表を適当な有限状態オートマトンに
変換しといて置換対象の文字列を頭から食わすみたいな
アルゴリズムにするのもおもしろいかもしれない。
たとえば ab → d, ac → e
状態0:
aなら状態1へ
bなら状態2へ
それ以外はその文字を出力して状態0へ
状態1:
bならdを出力して状態0へ
cならeを出力して状態0へ
それ以外はaとその文字を出力して状態0へ
みたいな。
006621
2006/11/02(木) 14:07:01(´ヘ`;)
0067デフォルトの名無しさん
2006/11/02(木) 14:29:13自分でコントロールできるから試してみる
価値はあるな>63
OSコールが気に入らなきゃ、その部分を自分で
組み立てたっていいし
0068デフォルトの名無しさん
2006/11/02(木) 14:29:24同じ出だし辞書は全部飛ばし、別の出だし単語へ。
006968
2006/11/02(木) 14:32:440070デフォルトの名無しさん
2006/11/02(木) 15:08:23> s/(文字列1|文字列2|...)/$h{$1}/g のようにするのとはどちらが
> 速いだろうか
/(文字列1|文字列2|...)/ より /文字列1/ or /文字列2/ or ... って分けた方が早いらしいよ。
・・・って、どれかひとつにマッチしたら他にマッチしない前提なのかな
007121
2006/11/02(木) 15:21:500072デフォルトの名無しさん
2006/11/02(木) 19:45:27これで $now_size が $size より小さければ $max_buf は0になります。
$now_size が $size より大きければ $max_buf には $size より足りない数になります。
どうなるかは解ったのですが、そうしてこうなるのかが解りません。
どういう風に解釈したら良いのでしょう。
<例>
$size = 12
$now_size = 10
$max_buf = 0
<例>
$size = 10
$now_size = 12
$max_buf = -2
0073デフォルトの名無しさん
2006/11/02(木) 20:06:12> $max_buf = $size - $now_size if $size - $now_size < $max_buf;
>
> これで $now_size が $size より小さければ $max_buf は0になります。
ちがう。if文が偽を返しただけだ。
0074デフォルトの名無しさん
2006/11/02(木) 20:14:27ううん。
すみません、良くわかんないです。
ただ、理解する手がかりになりましたので勉強します。
回答をありがとうございました。
0075デフォルトの名無しさん
2006/11/03(金) 20:42:55毎回正規表現をコンパイルしにいってるから遅いとかはないかな?
このサンプルを元に作ってみたら?
日本語がほしけりゃPerl Cookbookを買いましょう。
ttp://www.unix.org.ua/orelly/perl/cookbook/ch01_18.htm
0076デフォルトの名無しさん
2006/11/04(土) 13:25:02> $max_buf = $size - $now_size if $size - $now_size < $max_buf;
これは
if( $size - $now_size < $max_buf ){
$max_buf = $size - $now_size;
}
と同じです。っていうのは分かってるのかな・・・?
0077デフォルトの名無しさん
2006/11/05(日) 00:10:100078デフォルトの名無しさん
2006/11/05(日) 00:22:57@_の要素数を見ればいくつパラメタが与えられたかわかるので
適当に分岐なりなんなりすればよい。
0079デフォルトの名無しさん
2006/11/05(日) 04:24:45途中で改行したいのですが、実際に条件式の途中で改行するとエラーになってしまいます。
解決策を教えてください。
条件式
$hoge =~ /VALUE="(.*?)"(?:.|[^.])*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)".*?VALUE="(.*?)"(?:.|[^.])*>(\d+)(?:\(hugahuga\)|\(hogehoge\))/;
0080デフォルトの名無しさん
2006/11/05(日) 05:02:16"x" をつける
0081デフォルトの名無しさん
2006/11/05(日) 05:15:00できました。
これ便利ですね。
どうもありがとうございました。
0082デフォルトの名無しさん
2006/11/05(日) 13:16:32$hoge =~ /プーさん/;
を実行すると
Unmatched [ in regex; marked by <-- HERE in m/プー <-- HERE さん/ at C:\hoge\test.pl
とエラーになります。
パターンの先頭がパー、ピー、プー、ペー、ポーにだとエラーになるようです。
$hoge =~ /\プ\ー/;
エスケープしてもうまくいきません。
どうしてでしょうか?
0083デフォルトの名無しさん
2006/11/05(日) 13:29:26長音(ー)の2バイト目が 0x5B で、'[' (0x5B) として解釈されてしまうからです。
\Q と \E で囲むと、その間の文字列は正規表現として解釈されなくなります。
/\Qプーさん\E/
ではどうでしょうか?
0084デフォルトの名無しさん
2006/11/05(日) 13:31:59全部EUCで書いちゃうのも手かもね。
0085デフォルトの名無しさん
2006/11/05(日) 17:56:01ファイルをアップすると[upxxxx.xxx]という名前に強制的になりますが、
これを[MAQxxxxx.MP4]という様にしたいです。
(xxxxxの部分は、アップされた順に00001,00002,00003という感じに)
どうすれば良いのでしょうか?
また、MP4ファイルをアップしそれを落とそうとしてファイル名のところを
クリックすると、QuickTimeによって再生され、保存することが出来ません。
これを再生されること無く、ファイル名をクリックしただけでDLが始まるようにするのは
どうすれば良いのでしょうか?
分かりにくい文章かもしれませんが、教えてください。お願いします。
0086デフォルトの名無しさん
2006/11/05(日) 18:59:54前半はすれ違い
後半はいた違い
0087デフォルトの名無しさん
2006/11/05(日) 19:12:36え・・・
uploder.cgiの中身を書き換えるんじゃないんですか?
そうだと思ってPerlのスレにに書いたのですが・・・。
もしかして、ここじゃなくてCGIの質問スレに書くべきでしたでしょうか。
0088デフォルトの名無しさん
2006/11/05(日) 19:55:09>>1
0089デフォルトの名無しさん
2006/11/06(月) 00:06:180090デフォルトの名無しさん
2006/11/06(月) 00:55:100091デフォルトの名無しさん
2006/11/06(月) 01:49:21009282
2006/11/06(月) 02:11:23\Q, \Eを使って解決しました。
レスありがとうございました。
0093デフォルトの名無しさん
2006/11/06(月) 04:18:12今は下のようにめんどくさいことをしています。何かうまい方法はありませんか?
print "ほげ";
print LOG "ほげ";
print "ふがふが";
print LOG "ふがふが";
0094デフォルトの名無しさん
2006/11/06(月) 04:33:50perl のプログラムでは標準出力に出すだけ。
tee を使ってリダイレクトするか、
単にリダイレクトしてそのファイルを別端末で tail -f する。
0095デフォルトの名無しさん
2006/11/06(月) 04:54:25二穴用のさぶる〜ちん作りゃいいやん
0096デフォルトの名無しさん
2006/11/06(月) 05:29:48open(STDOUT,"|tee log");
0097デフォルトの名無しさん
2006/11/06(月) 06:20:270098デフォルトの名無しさん
2006/11/07(火) 04:16:20$data { 'Class_A' } [ 0 ] { 'FirstName' } = '太郎' ;
みたいな配列とハッシュを組み合わせた変数を用意しようと思います。
リファレンスとか多次元とかサブルーチンとかごちゃごちゃで混乱してます。
【1】変数の値を生成し、代入したい
my %data;
#(略。ループとかDBからの取得とか)
my %hash;
$hash{'FirstName'} = '太郎';
$hash{'FamilyName'} = '田中';
push ( @data{'Class_A'} , \%hash );
#(略。ループ終了とか)
と書いてみたのですが、型が違ぇよボケ(意訳)と言われてしまいました。
(実際には、Class_Aや田中、太郎の部分にはデータベースから取得した値が入る)
仕方ないので、
my @tmp = @data{'Class_A'};
と、あらかじめコピーしておいてから、最後に
push(@tmp,\%hash);
@data{'Class_A'} = \@tmp;
一時ファイルの中身を戻すとかやってる始末です。
もうちょっとスマートな方法はありませんでしょうか。
0099デフォルトの名無しさん
2006/11/07(火) 04:17:50A組→B組→B組→B組→C組→A組→C組 とかもありえます。
各クラスの生徒数は不明です。
【2】特定のクラスに所属する生徒の情報を取り出したい。
なお、取り出す順番(出席番号)については言及しない。もちろんしてもいい。
foreach my $key (keys @data{'Class_A'} )
というループを作ってみたのですが、最終的な値(田中とか太郎とか)を取得する方法が分かりません。
$data{'Class_A'}[$key]{'FirstName'}
$key{'FirstName'}
など幾つか試してみましたが、全く取得できる気配はありませんでした。
(どちらも「太郎」などの文字列の取得を期待しています)
0100デフォルトの名無しさん
2006/11/07(火) 04:36:35push ( @data{'Class_A'} , ¥%hash );
のところを
push ( @{$data{'Class_A'} }, ¥%hash );
でいいんじゃないか
0101デフォルトの名無しさん
2006/11/07(火) 04:44:23my %data;
#(略。ループとかDBからの取得とか)
my %hash;
$hash{'FirstName'} = '太郎';
$hash{'FamilyName'} = '田中';
push (@{$data{'Class_A'}},¥%hash);
foreach my $class ('Class_A', 'Class_B', 'Class_C') {
foreach my $student (@{$data{$class}}) {
print $student->{'FirstName'} . $student->{'FamilyName'} . "¥n";
}
}
010298
2006/11/07(火) 04:48:00これ以上パソコンとお見合いしてると明日(というか今日)の仕事に響くので
検証は夜にでもやりたいと思います。
ほんとうにありがとうございました…… zzz
0103デフォルトの名無しさん
2006/11/07(火) 07:15:07そのまま貼るのが基本。
0104デフォルトの名無しさん
2006/11/07(火) 17:23:16hashやlistの値として、直接 hash や list は格納できないが、リファレンスは格納可能。
従って、
$data{'Class_A'}->[0]->{'FirstName'} = '太郎';
ならOK。しかしややこしいことに、上記は
$data{'Class_A'}[0]{'FirstName'} = '太郎';
と書いても同様に解釈される。これだと表記上、hash の値にlistが
格納されているように見えるが、実際には list のリファレンスが格納されている。
list のリファレンスなので、その全体は @{$data{'Class_A'}} で参照する。
@$data{'Class_A'} じゃダメ。
010598
2006/11/07(火) 20:02:45勘でコーディングするだけでなく、しっかりと何をしているか認識しないと駄目ですね。
Cのポインタはなんかはすぐに理解できたんですが、Perlはそれ以上に混乱しそうです。
>103
おっしゃる通りです。以後気をつけます。
0106デフォルトの名無しさん
2006/11/07(火) 20:13:57@array=($sec,$min,$hour,$day,$mon,$year);
0107デフォルトの名無しさん
2006/11/07(火) 20:38:34質問するより
print join(',', @array) . "¥n";
で試した方がはやくね? 釣り?
0109デフォルトの名無しさん
2006/11/07(火) 20:54:03釣り?
0110デフォルトの名無しさん
2006/11/07(火) 21:11:17実行できる環境じゃないんです;;
0112デフォルトの名無しさん
2006/11/07(火) 21:13:37実行できる環境じゃないんです;;
0113デフォルトの名無しさん
2006/11/07(火) 21:17:480114106
2006/11/07(火) 21:23:36C++でもJavaでもできるので、できるものとして書いていきます
0115デフォルトの名無しさん
2006/11/07(火) 21:36:290116デフォルトの名無しさん
2006/11/07(火) 21:41:21できない。
0117デフォルトの名無しさん
2006/11/07(火) 21:49:59011993
2006/11/07(火) 23:19:58print $tee "ほげふが";
で解決しました。
レスありがとうございました。
0120デフォルトの名無しさん
2006/11/07(火) 23:55:34<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>
これを送信したいんですが下のようにすると取り消しが送られてしまいます。
どうすればいいですか?
$string = "上のHTML";
$url = 'http://hoge/hoge.cgi';
$string =~ /NAME=huga\sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
$ua = LWP::UserAgent->new;
$req = POST($url, [%formdata]);
$res = $ua->request($req);
0121デフォルトの名無しさん
2006/11/08(水) 00:11:16>>1
0122デフォルトの名無しさん
2006/11/08(水) 00:17:34<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>
EOF
$string =~ /NAME=huga¥sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
print join(',', %formdata) . "¥n";
>>120は上記を参考にして出直してください。
上記の結果が予想と一致するのであれば、スレ違いかな。
予想と違うのであれば、どっかがおかしい。
0123デフォルトの名無しさん
2006/11/08(水) 00:36:44HTMLを標準出力やファイルに出力するスクリプト自体はWebProg板じゃなくてもOKよね?
0124120
2006/11/08(水) 00:39:04簡易HTTPブラウザを作っていて、
以下のHTMLを受け取った時に解析して送信するといった処理をしたいのです。
やはりスレ違いでしょうか?
<FORM ACTION="hoge.cgi" method="POST">
<INPUT TYPE=HIDDEN NAME=huga VALUE="huge">
<INPUT TYPE=SUBMIT NAME=ok VALUE="送信">
<INPUT TYPE=SUBMIT VALUE="取り消し">
</FORM>
use LWP::UserAgent;
use HTTP::Request::Common qw(POST);
$string = "上のHTML";
$url = 'http://hoge/hoge.cgi';
$string =~ /NAME=huga\sVALUE="(.*?)"/;
%formdata = ('huga' => $1);
$ua = LWP::UserAgent->new;
$req = POST($url, [%formdata]);
res = $ua->request($req);
0125デフォルトの名無しさん
2006/11/08(水) 01:03:51CGI/HTTPの問題であればスレ違い。
文字列のパーシングとかならOK。
で、文字列のパーシングに関しては良さそうに思う。
>>122 のコードで確認しる。
>>124は、どこ(CGI/HTTP/文字列処理/etc.)が怪しいのか切り分けできてるのか?
0126120
2006/11/08(水) 01:25:48ありがとうございます。>>122の意味を掴めていませんでした。
送信、取り消しの違い(ok)をどうやって区別するかを尋ねましたが、スレ違いでした。
0127デフォルトの名無しさん
2006/11/08(水) 01:40:06submitが複数あるフォームでどのsubmitが押されたかを知りたいってこと?
もしそうなら完全に板違いだね。
webprog板の初心者perlスレが良いと思う。
0128デフォルトの名無しさん
2006/11/08(水) 01:41:38とっくにそのスレに移動してんだろ。
死ねよ俺www
ごめんなさい…orz
0129デフォルトの名無しさん
2006/11/08(水) 08:29:46罰として次回のスレ立てを命ずるw
0130デフォルトの名無しさん
2006/11/08(水) 15:24:02ARR_1[1] =1;
@ARR_2 = @ARR_1;
++$ARR_2[1];
print ($ARR_1[1]);
だと当然 1が出力されます
ARR_1[1][1] =1;
@ARR_2 = @ARR_1;
++$ARR_2[1][1];
print ($ARR_1[1][1]);
だと何故か1ではなく、$ARR_2[1][1]の値である2が表示されてしまいます
どこか間違っていますでしょうか?
0131デフォルトの名無しさん
2006/11/08(水) 15:38:380132130
2006/11/08(水) 15:52:23よく分かっておりませんが
上の場合は 両方とも、1というスカラー値が入っております
下の場合は、両方とも配列へのリファレンスが入っています
(なぜか$ARR_1と$ARR_2には同じ物へのリファレンスが入ってしまってます)
0133デフォルトの名無しさん
2006/11/08(水) 15:52:54Net::FTPのquotコマンドの引数の書き方がわからないのですが
quot (CMD [,ARGS]) この場合
$ftp->quot("/usr/bin/du", "-k -s ../")
これであってますか?
0134デフォルトの名無しさん
2006/11/08(水) 15:57:43リファレンスをコピーしてもそれらが指す実体は変わらない。
ディープコピーしたければ以下のモジュールを。
http://search.cpan.org/~rdf/Clone-0.22/ (要コンパイル)
http://search.cpan.org/~evo/Clone-PP-1.02/ (PurePerl)
0135デフォルトの名無しさん
2006/11/08(水) 16:08:31>(なぜか$ARR_1と$ARR_2には同じ物へのリファレンスが入ってしまってます)
リファレンスが入った配列を代入したんだから、そうなっていて正常
>++$ARR_2[1][1];
ここでは実体を変えてる
昔の友達の電話番号にかけたら違う人が出た、みたいな
0136130
2006/11/08(水) 16:22:12私の認識が間違っておりました
ここに書いたのは省略したコードで
実際に詰まってしまった実コードはもっと複雑なスパゲティになっております
全部見直さなきゃ。
0137デフォルトの名無しさん
2006/11/09(木) 00:01:25(A B) (C D)
をSQL文
(x='%A%' or x='%B%') and (x='%C%' or x='%D%')
に変換するスクリプトを簡単に書く方法はないでしょうか?
Text::Balancedを使って()の対応はチェックしていますので、
()の対応は取れているという前提でやっているのですが
なかなか上手くいきません。
0138デフォルトの名無しさん
2006/11/09(木) 10:32:50このようにするしかないのでしょうか?
test(*OUT);
sub test {
local *FD = shift;
flock(FD, 2);
}
0139デフォルトの名無しさん
2006/11/09(木) 10:55:14index ($data,$key,2)を実行したら3が返ってきたので、
"能"の第二バイト\が原因と考えそれを他の文字に置き換えたら
正しく 4 が返ってきました。
で、今日こんな場合の上手い対処方法はないか質問しようと
もう一度、index ($data,$key,2)を何も手を加えずに実行したら
4が返ってきました。
indexの動作に何か環境条件が影響するんでしょうか?
0140139
2006/11/09(木) 10:57:500141デフォルトの名無しさん
2006/11/09(木) 12:25:32渡す方は、
open(FD, "hoge") or die;
test(*FD{IO});
または
my $fh;
open($fh, "hoge") or die;
test($fh);
受け取る方はどちらでも
sub test {
my $fh = shift;
}
ただし、perl 5.8 以降だった気がする
0143デフォルトの名無しさん
2006/11/09(木) 15:09:36間違っているわけではないけど、use strict できないし、古めかしい。
perl 5.6 以前のバージョンでは(記憶に間違いがなければ)、>>138のような
書き方をせざるを得なかったんじゃないかな。
0144138
2006/11/09(木) 15:43:130145デフォルトの名無しさん
2006/11/09(木) 15:46:20$twoBytes = '[\x81-\xFC][\x40-\xFC]';
$string =~ /^(?:$ascii|$twoBytes)*?(?:\Q$key\E)/;
これでマッチした位置をしる方法ないですか?
length $` は、0が返ってきました。
perl v5.6.1
0146デフォルトの名無しさん
2006/11/09(木) 15:56:30($*をいじってない限り)
0147145
2006/11/09(木) 16:17:31length ($string) - length ($key) - length ($')
0148デフォルトの名無しさん
2006/11/09(木) 16:56:34$string =~ /^(?:$ascii|$twoBytes)*?(?:\Q$key\E)/;
を
$string =~ /^(?:$ascii|$twoBytes)*?(\Q$key\E)/;
にかえて $-[1] じゃないか。$keyの部分がキャプチャされる
のがどうしても嫌なら
$string =~ /^(?:$ascii|$twoBytes)*?()(?:\Q$key\E)/;
でもいいがちと見難いかも。
$'はパターンマッチ使う場所がそこだけしかないような小さい
プログラムならいいが、一般的にはあまりお勧めしない。
0149デフォルトの名無しさん
2006/11/09(木) 17:16:56解決隅にレスるのもなんだが pos 使えば?
my $str = 'hogefugehagehoge' ;
print +( pos $str ) . "\n" while $str =~ /(hage)/g ;
0150145
2006/11/09(木) 17:59:53あっ、そっちの方が全然スマートですね。頂きます。
ところで、$' が芳しくない理由はどんなことに起因しますか?
参考サイトがあったら教えて下さい。勉強します
0151デフォルトの名無しさん
2006/11/09(木) 18:49:47> ところで、$' が芳しくない理由はどんなことに起因しますか?
添付マニュアルに書いてある。
0152デフォルトの名無しさん
2006/11/09(木) 19:37:06せっかく解答してくれてるのに>>149氏を無視すんなよ…
0154デフォルトの名無しさん
2006/11/09(木) 20:14:22153 は 149 です。150 さん御免。
0155デフォルトの名無しさん
2006/11/09(木) 20:15:04無視が許容されているから答える人がたくさん現われるのである。
0156145=150
2006/11/09(木) 20:47:33ごめん。
pos何て使ったことないから勉強のため、それも試したんだけど、
my $str = 'hogefugehagehoge';
print +( pos $str ) . "\n" while $str =~ /(hage)/g;
print $-[1];
--------------------------------
12
8
こんな答えがでたんで、どうレスつけていいか迷って。。。。
塚、プログラムの方が忙しくて、忘れてしまったです スマソ
0157デフォルトの名無しさん
2006/11/09(木) 21:05:54SCALAR に対して前回に m/ /g サーチが行われた場所を返す。この関数は、最後に
マッチした場所の次の文字のオフセットを返す・・。
programing Perl / 2nd Edition 改訂版 P.228 より。
0158デフォルトの名無しさん
2006/11/09(木) 22:59:34open $fh, $filename が使えないんなら、use FileHandleとかすればいいんじゃね?
0159デフォルトの名無しさん
2006/11/10(金) 17:00:16v5.8.8 builtを使用しています
system関数を使用して2〜3個のプログラムを連続で実行させようとしているのですが
「system("Perl hoge.pl < in.txt")」 が実行できません。
誰かご教授お願いします。
「system("Perl hoge.pl in.txt")」のほうはうまくいきました
試した例
my @cmd = ('perl', 'hoge.pl', '< in.txt');
my $ret = system @cmd;
my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
0160デフォルトの名無しさん
2006/11/10(金) 17:20:15質問するならOSなどの環境とどう動かないか(エラーが出るとか、一見動いたように見えるが
結果がこうなるはずなのにこうなったとか)を説明しろよ。
0161159
2006/11/10(金) 17:28:08すいません。
OS: XP
my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
print $ret;
を入れたところ、「65280」という値が返ってきて、失敗しました。
my @cmd = ('perl', 'hoge.pl', '< in.txt');
my $ret = system @cmd;
print $ret;
の場合はhoge.plは実行されますが、< in.txtが引数(@argv)と勘違いされてるのか標準入力がうまくいきませんでした。(入力画面で止まる)
0162デフォルトの名無しさん
2006/11/10(金) 17:36:41my $cmd = 'cmd perl hoge.pl < in.txt';
でどうかな?(試していないが)
0163159
2006/11/10(金) 18:28:36うまくいきませんでした。
my $cmd = 'cmd perl hoge.pl < in.txt';
my $ret = system ($cmd);
if ($ret != 0) {
print "error [$ret]\n";
}
で、試した所
error [65280]
となりました。
ちなみに
$ perl hoge.pl < in.txt とそのまま実行はできていますので、in.txtがない、名前を間違えてる等の間違いはないです。
0164デフォルトの名無しさん
2006/11/10(金) 19:04:14幾つか試してみたけれど、そのExit codeはhoge.plの中にエラーがある場合に帰ってきてるな。
hoge.plをもっと単純な内容に変えてやってみたらどうなる?
うちの環境(ActivePerl build 819 on Windows XP)では、
hoge.plを空のスクリプトや、標準入力の内容をそのまま表示するだけの内容にして
my $cmd = 'perl hoge.pl < in.txt';
my $ret = system $cmd;
でちゃんと動いてる
0165デフォルトの名無しさん
2006/11/10(金) 19:50:22色々試してくれてありがと。
hoge.plでは
print "好きな数字は?:";
$s=<STDIN>;
print "好きな数字は$s\n";
のみにしてみた。
in.txtは「1」だけ入れたけど、失敗
ちょっと。ActivePerl build 819に変えてやってみます。817だったので
0166デフォルトの名無しさん
2006/11/10(金) 20:32:06バージョンアップして駄目だったら、環境疑ったほうがよさそうだね。
んでかなり特殊な状況だけれど、その現象が起きる状態見っけた。
PERL5SHELL環境変数に値がセットされてないか調べてみれ。
それとPATHが通ってる場所に変なcmd.exeが無いかどうかも。
ttp://perldoc.jp/docs/perl/5.6.1/perlrun.pod#item_PERL5SHELL__specific_to_the_Win32_port_
0167159
2006/11/10(金) 20:46:44>PERL5SHELL環境変数に値がセットされてないか調べてみれ
>それとPATHが通ってる場所に変なcmd.exeが無いかどうかも
Path=C:\Program Files\MeCab\bin;C:\Perl\bin;C:\cygwin\bin;
PERL5SHELLはどうやってみる&変更するんでしょうか?
教えてもらえないでしょうかお願いします。
0168164=166
2006/11/10(金) 21:48:16# Perlの質問ではなくなってきてるけれど(;´Д`A
> Path=(snip);C:\cygwin\bin;
マテ、さっきプロンプトに$を使ってたがCygwin上のシェルからActivePerlを呼んでるのか。
> PERL5SHELLはどうやってみる&変更するんでしょうか?
見るには(コマンドプロンプトでもbashでも)setコマンド。
結果にPERL5SHELLが含まれてないか確認。
変更方法までは面倒見切れんので グ グ れ。
> PATHが通ってる場所に変なcmd.exeが無いかどうか
はCygwin上から使っててwhichを入れてあるなら
$ which cmd.exe
/cygdrive/c/WINDOWS/system32/cmd.exe
になっているかで確認できる。
これらが白ならいよいよ漏れには解らん。
0169159
2006/11/10(金) 22:00:28色々とありがとうございます
>マテ、さっきプロンプトに$を使ってたがCygwin上のシェルからActivePerlを呼んでるのか。
いえ、Windowsのコマンドプロンプトで使っています。
cygwinのパスを通してるだけです
>見るには(コマンドプロンプトでもbashでも)setコマンド。
>結果にPERL5SHELLが含まれてないか確認。
見てみますと、なかったので追加したんですが、うまく実行できませんでした
ながながとありがとうございます、今度友達のパソを借りて(違う環境で)試してみたいと思います
0170デフォルトの名無しさん
2006/11/10(金) 22:09:23後はCygwinのPerlが動いてたりとか。
0171デフォルトの名無しさん
2006/11/11(土) 10:53:49今度から業務移管で別の担当者が行うことになりました。
で、引き継ぎをしたら「CUIだと非常に使いにくい」とか
「GUIのコマンドラッパーみたいなもの作れないの?」と言われてます。
何か簡単に実現できるよい手はないでしょうか?
自分はckw+Nyacusで満足してたのですが・・。
0172デフォルトの名無しさん
2006/11/11(土) 10:54:15$ftp = Net::FTP->new
の$ftpをサブルーチンに渡すにはどうすればいいでしょうか?
&net($ftp);
sub net {
my $ftp = shift;
$ftp->ls;
}
のようにしたのですができないようです。
0173デフォルトの名無しさん
2006/11/11(土) 12:56:16変数に代入された値が数値か文字列かを
判別するにはどうすればいいんでしょうか?
0174デフォルトの名無しさん
2006/11/11(土) 13:14:46内部的には数値文字の区別ないよ
$string = '123xx';
$num = $string + 0;
print $string. " $num";
----------------
123xx 123
0175デフォルトの名無しさん
2006/11/11(土) 13:27:03普通にできると思うけど。
そもそもサブルーチンなしなら出来ているという確認はしたの?
サブルーチンなしでも出来ない、別の問題というオチじゃ
0176岐山面
2006/11/11(土) 13:33:19残念だがPerlで文字列と数字では変数型の区別がないです。できるのは、ある文字列は有効な数字の表現かどうかだけです。たとえば、ある文字列に対するいろんな判別方法は(→Perl Cookbook)
warn "has nondigits" if /\D/;
warn "not a natural number" unless /^\d+$/; # rejects -3
warn "not an integer" unless /^-?\d+$/; # rejects +3
warn "not an integer" unless /^[+-]?\d+$/;
warn "not a decimal number" unless /^-?\d+\.?\d*$/; # rejects .2
warn "not a decimal number" unless /^-?(?:\d+(?:\.\d*)?|\.\d+)$/;
warn "not a C float"
unless /^([+-]?)(?=\d|\.\d)\d*(\.\d*)?([Ee]([+-]?\d+))?$/;
0177デフォルトの名無しさん
2006/11/11(土) 13:36:09>>174の言うとおり、内部では区別なし。
次の質問は「数値として適切な文字列を判定する方法は?」
と「値を数値と解釈したい(or そのまま文字列として解釈したい)」
が予想されるが。。。
前者の簡単な判断は $val =~ /¥D/ なら数値以外が含まれていることになる。
が、小数点や符号や浮動小数点を考慮するともう少し複雑になる。
後者は、「$val + 0」で数値として扱われる。
算術演算子で扱わなければ文字列として扱われるが、「$val . ""」で文字列として扱われる。
0178デフォルトの名無しさん
2006/11/11(土) 13:55:33ttp://www.nikkei.co.jp/news/past/honbun.cfm?i=AT1G10035%2010112006&g=K1&d=20061110
0179デフォルトの名無しさん
2006/11/11(土) 14:15:440180デフォルトの名無しさん
2006/11/11(土) 14:17:480181デフォルトの名無しさん
2006/11/11(土) 14:27:04>>176
>>177
レスありがとうございます。$val + 0で期待通りの動作に出来ました。
0182デフォルトの名無しさん
2006/11/11(土) 16:46:580183岐山面
2006/11/11(土) 17:01:140184182
2006/11/11(土) 17:16:49DBD::mysqlについてです。
0185岐山面
2006/11/11(土) 17:27:390186デフォルトの名無しさん
2006/11/11(土) 17:47:07基本は
$ perl Makefile.PL
$ make
$ make test
$ make install (ここは root 権限で)
なので、一度やってみ。
0187182
2006/11/11(土) 18:19:05ありがとうございます。
書いて下さった手順は一通りやっていて、make test で一つだけエラーが出ています。
t/40bindparam........FAILED test 23
Failed 1/28 tests, 96.43% okay
この状態でとりあえずインストールまでやって、MovableType3.3を動かそうとしていますが、
mt.cgiで下のようなエラーを吐いています。
Got an error: install_driver(mysql) failed: Can't load '/usr/local/lib/perl5/site_perl/5.8.7/i86pc-solaris/auto/DBD/mysql/mysql.so' \
for module DBD::mysql: ld.so.1: perl: fatal: /usr/sfw/lib/libgcc_s.so.1/libmysqlclient.so.15: Not a directory at /usr/local/lib/perl5/5.8.7/i86pc-solaris/DynaLoader.pm line 230.
at (eval 9) line 3
Compilation failed in require at (eval 9) line 3.
Perhaps a required shared library or dll isn't installed where expected
at lib/MT/ObjectDriver/DBI/mysql.pm line 96
"/usr/sfw/lib/libgcc_s.so.1/libmysqlclient.so.15"というパスは存在していない(libgcc_s.so.1はディレクトリじゃない)
ので、ここがネックなのかな、と思っていますが、どこの設定の結果ここを見に行っているのか把握できないので、
どうかご教授お願いします。
0188デフォルトの名無しさん
2006/11/11(土) 18:57:39オラわかんね。
ちなみに、Solarisに二つperlが入ってるってことはないよね?
/usr/bin/perl と /usr/local/bin/perl があって、DBD のインストール対象と mt.cgi が
使ってるものが違うとか。ハズしてたらめんご。
0189デフォルトの名無しさん
2006/11/11(土) 19:15:10こんなの見つけたよう。
http://dev.mysql.com/doc/refman/4.1/ja/perl-support-problems.html
0190182
2006/11/11(土) 19:48:11>>188
難しいですよね(´・ω・`)
デフォルトで入っていたものは退避させていて、新しい方を見に行くように設定しています。
>>189
わざわざありがとうございます。
しかし、書いてあるような"-static -config"ってオプションはないみたいなんですよ。
バージョン5系を使っているので、無くなっちゃったんですかね。。。
0191182
2006/11/11(土) 19:56:39LD_LIBRARY_PATHにもLDFLAGSにも/usr/libを通しているんですけどね。。。
困りました(^_^;)
0192デフォルトの名無しさん
2006/11/11(土) 21:23:54http://perldoc.jp/docs/modules/DBD-mysql-2.1026/DBD/mysql/INSTALL.pod
内の「既知の問題」の 3. がそれっぽい気がします。
mysqlclient.so では動作せず、スタティックリンクが必要なシステムがあるということのようです。
僕もようわからんので、追加情報 & 経過報告よろしく。
0193デフォルトの名無しさん
2006/11/11(土) 22:07:08問題の切り分けとして。
シンプルなテストプログラムですら動かない?
use DBI;
$dbh = DBI->connect('DBI:mysql:dbxxx:hostxxx', 'userxxx', 'passxxx');
くらいでもいいと思うけど。
0194182
2006/11/11(土) 22:08:44ありがとうございます。
libmysqlclient.so周りがあやしい、っていうのは前出のと同じ感じなんですね。
オプションの指定の仕方がハッキリとは書いてない感じなので、いろいろ試してみます。
・libmysqlclient.aを/usr/libにコピー→変わりなし
# 明示的に指定しないとダメなんですね(^_^;)
・mysql_config --libsの結果をコピーして、mysqlclient部分をlibmysqlclient.a
のフルパスに書き換え、貼り付け→オプションエラー
0195デフォルトの名無しさん
2006/11/11(土) 22:34:17Perl/Tk使うとか?
あるいはWin32::GUI::Loftとか。
0196182
2006/11/11(土) 23:35:48一行目にperlパス追加したCGIにして実行しましたが、下のようになりました。
Name "main::dbh" used only once: possible typo at CGIファイルのパス line 3.
194の最後に書いた方法、ダブルクオートで囲むのを忘れていましたorz
しかし、それでやるとmake testでほぼ全滅になり、余計ダメみたいでした(;つД`)
0197デフォルトの名無しさん
2006/11/12(日) 00:10:31>一行目にperlパス追加した
もしかして perl に -w オプション付けてる? だったら -w 外すか、
my $dbh = ..
にしてみて。動いてるような気がする、のはらたいらに3000点
0199デフォルトの名無しさん
2006/11/12(日) 00:52:17ということは、最低限DBに接続できていると言うことになるんじゃ?
試しにパスワードとかデタラメにしてエラーが出るように変わるか確認すればいいよね。
ということは、DBDのインストール成功(make testの影響はわからないが)。
じゃ、mt.cgi は何でよ、ってのはわからんけど。
0200182
2006/11/12(日) 01:14:38ユーザ、パスワードイジったらコネクションできなかったので何らかの形にはなってる、ってことですね。
MTのモジュールチェック用CGIでもインストールされている、という表示は出ています。
ますます原因がわからなくなってきましたね(´・ω・`)
0201デフォルトの名無しさん
2006/11/12(日) 01:15:550202デフォルトの名無しさん
2006/11/12(日) 01:20:110203デフォルトの名無しさん
2006/11/12(日) 01:39:380204デフォルトの名無しさん
2006/11/12(日) 02:23:33Devel::Trace
0205デフォルトの名無しさん
2006/11/12(日) 07:43:340206デフォルトの名無しさん
2006/11/12(日) 08:29:10print "hoge\n";
}
これを簡略化して
if ($str eq ('ほげ' || 'ふが' || 'もが')) {
print "hoge\n";
}
としたのですが、うまくいきませんでした。
簡単に書ける方法があったら教えてください。
0207デフォルトの名無しさん
2006/11/12(日) 08:45:03ただし ほげ ふが もが にマルチバイト文字や記号が入る時は
\Q と \E で囲わないと、ダメな場合がある。 >>82-84 辺りを参照。
0208デフォルトの名無しさん
2006/11/12(日) 08:51:31print "hoge\n" if grep {$str eq $_} ('ほげ', 'ふが', 'もが')
0209206
2006/11/12(日) 10:10:14なるほどお
正規表現を使うことは全く頭にありませんでした。
ひとつ知恵が付きました。
>>208
grep関数、知らなかったので調べてみました。
これ便利ですね。
>>207-208
おかげで解決しました。
レスありがとうございました。
0210デフォルトの名無しさん
2006/11/12(日) 11:17:00まあ、そこまでするくらいなら普通に比較した方が楽だとは思うけど
比較文字列に何らかの修正を加える場合なら一考の余地ありかと思う。
大文字小文字を区別しないとか、半角カナ・全角カタカナ・ひらがなを区別しないとか。
0211デフォルトの名無しさん
2006/11/12(日) 11:37:24解決隅にレスるのもなんだが誰も指摘しないので一応書いとく。
my $str = 'bar' ;
if ( $str eq 'fuga' || 'hoge' || 'bar' ){ print 'hoge' . "\n" ; }
0212デフォルトの名無しさん
2006/11/12(日) 11:39:120213デフォルトの名無しさん
2006/11/12(日) 13:03:46君がperlを愛しているからさ
0214デフォルトの名無しさん
2006/11/12(日) 13:34:15一応こういうものもある。
Perl6では言語機能として提供されるようだね。
0215デフォルトの名無しさん
2006/11/12(日) 18:21:48手動でバイナリエディタから削除したものとPerlスクリプトでのものが同一になりません
すみませんがアドバイスを頂けないでしょうか
open (IN,"hoge");
open (OUT, ">hogehoge");
binmode IN;
binmode OUT;
@bin = <IN>;
$binout = "";
foreach $bin(@bin){
$binout .= unpack("H*", $bin);
}
$bin2 = substr($binout,32);
print OUT pack("H*",$bin2);
close (IN);
close (OUT);
こんな感じでスクリプトを書いてみたのですが…
ちなみに substr の所をコメントアウトして unpack したものをそのまま pack したところ
同一のファイルが出力されることは確認してます
0216182
2006/11/12(日) 18:26:45環境変数LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/(mysqlのインストール先ディレクトリの、ライブラリがある場所)がないと
>>193さんのテストスクリプトも動かなくなります。
逆に、追加してあるとコマンドライン上でmt.cgiもエラーを吐かなくなります。
ブラウザ上では相変わらずなので、見に行くライブラリの指定が足りない状態でインストールされてる、ってことなんでしょうかね。。。
0217デフォルトの名無しさん
2006/11/12(日) 18:26:54置換等の作業もするので16進ダンプを使用したいのです
最初の確認で躓き…orz
0218182
2006/11/12(日) 18:36:26コマンドライン上だと下のような実行結果になる、ということです。
LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/がない
test.cgi => ×
mt.cgi => ×
LD_LIBRARY_PATHに/usr/local/mysql/lib/mysql/がある
test.cgi => ○
mt.cgi => ○
↓出力内容
Status: 302 Moved
Pragma: no-cache
Location: http://設置WebサイトURL/MTのディレクトリ/mt-upgrade.cgi?__mode=install
0219デフォルトの名無しさん
2006/11/12(日) 18:56:49なるほど、LD_LIBRARY_PATH の問題だったか。
じゃあ、httpd にも LD_LIBRARY_PATH を設定すれば解決するんじゃないかな。
Solarisではどのように httpd 起動してるんだっけな。
/etc/init.d/httpd あたりだっけ? そこで追記するか、そこから apachectl を
呼び出しているなら apachectl へ追記するか。で、httpd を再起動。
スレ違いになっちゃったけどね。
0220215
2006/11/12(日) 20:20:29同一の方法で抽出からやり直したところ、ちゃんと想定通りの結果になりました。
スレ汚し申し訳ない…
0221182
2006/11/12(日) 22:33:06ありがとうございます、ようやく解決できました。
やはりApacheにLD_LIBRARY_PATHを持たせる、というのでOKでした。
ApacheのconfファイルにデフォルトでLD_LIBRARY_PATHをset envするオプションがついていて、
そこに"/usr/sfw/lib/libgcc_s.so.1"が記述されていたので、libmysqlclientをそこに見に行って、
>>187のエラーになっていたようです。
ホントにスレ違いでしたが、ありがとうございました!
0222デフォルトの名無しさん
2006/11/12(日) 23:57:14ファイル全てを一つの文字列としてスカラー変数に入れたいのですが、
どう書くのが適切かつコンパクトですか。
0223デフォルトの名無しさん
2006/11/12(日) 23:58:44use File::Slurp;
my $text = read_file('filename');
0224デフォルトの名無しさん
2006/11/13(月) 00:05:10ありがとうございます。それ調べてみます。
ちなみに、モジュールを使わないケースではどうなりますか?
0225デフォルトの名無しさん
2006/11/13(月) 00:12:090226デフォルトの名無しさん
2006/11/13(月) 00:12:12{
local( $/, *FH ) ;
open( FH, $file ) or die "sudden flaming death\n"
$text = <FH>
}
[2]
local( *FH ) ;
open( FH, $file ) or die "sudden flaming death\n"
my $text = do { local( $/ ) ; <FH> } ;
[3]
{
local( $/ ) ;
open( my $fh, $file ) or die "sudden flaming death\n"
$text = <$fh>
}
[4]
open( my $fh, $file ) or die "sudden flaming death\n"
my $text = do { local( $/ ) ; <$fh> } ;
[5]
my $text = do { local( @ARGV, $/ ) = $file ; <> } ;
0227222
2006/11/13(月) 00:28:11と、取り敢えず安全性?なんたるものか調べます。
0228さくら
2006/11/13(月) 00:51:29「画面上に(kterm)に「last
proxy 」と二つのメニュー(それぞれプログラム
名)を表示させ、lastをクリックして選べばlastコマンドの出力から、
自分(0123456)がログインした回数を数える(他のユーザーは数えない)
サブルーチンが実行される。
またproxyを選べば、proxyのログから、ある今までにもっともサイト
にアクセスした時間帯を表示するサブルーチンが実行される。」
というプログラムを組みたいのです。proxyはどんな解析がいいか、
いろいろ考え中でしたが一例として述べました。。。どなたか、アドバイス等
お願いします!!!!
0229デフォルトの名無しさん
2006/11/13(月) 01:14:14日本語でおq
0230デフォルトの名無しさん
2006/11/13(月) 01:29:33これは完全に文系向けのものだな
厳密でない
基本的に1次元のデータが基本
列操作、多次元操作がまともにできないってどんなくそ言語だよ・・・
fortran90から移行したが
それととくらべると
とんでもないだめ言語だな
perlは
0231デフォルトの名無しさん
2006/11/13(月) 01:32:20その通りだな!! 時間の無駄だから、さっさとPerlのことは忘れた方がいい。
がんばってくれ。
0232デフォルトの名無しさん
2006/11/13(月) 01:36:55アドバイスとしては、ちゃんと読み書きの勉強して、色々な本を読もうね、ってとこかな。
0233デフォルトの名無しさん
2006/11/13(月) 04:40:51下記が今使っているコードですが、これをもっとスマートに書く方法があれば教えてください。
$number1 = 8;
$number2 = 3;
$number3 = 4;
if (($number1 < $number2) && ($number1 < $number3)) {
print "\$number1が一番小さいです。\n";
} elsif (($number2 < $number1) && ($number2 < $number3)) {
print "\$number2が一番小さいです。\n";
} elsif (($number3 < $number1) && ($number3 < $number2)) {
print "\$number3が一番小さいです。\n";
}
0234233
2006/11/13(月) 04:49:04訂正します。
if (($number1 <= $number2) && ($number1 <= $number3)) {
print "\$number1が一番小さいです。\n";
} elsif (($number2 <= $number1) && ($number2 <= $number3)) {
print "\$number2が一番小さいです。\n";
} elsif (($number3 <= $number1) && ($number3 <= $number2)) {
print "\$number3が一番小さいです。\n";
}
0235デフォルトの名無しさん
2006/11/13(月) 07:10:09贅沢な方法ではsortする手があります。
0236デフォルトの名無しさん
2006/11/13(月) 09:38:540237デフォルトの名無しさん
2006/11/13(月) 11:34:01はどういう意味ですか?
0238デフォルトの名無しさん
2006/11/13(月) 11:37:07配列変数 @value の最後の添え字
@value = ('a', 'b', 'c', 'd')
なら最後の要素 'd' は $value[4] なので $#value は 4 になる
0239デフォルトの名無しさん
2006/11/13(月) 11:37:530240237
2006/11/13(月) 11:39:46>$#変数名 は、@変数名 の配列の最後の添え字(個数から1をひいたもの)を表わします。
0241デフォルトの名無しさん
2006/11/13(月) 11:40:33レスありがとうございました。
添え字をあらわすんですね。
0242デフォルトの名無しさん
2006/11/13(月) 11:47:180243デフォルトの名無しさん
2006/11/13(月) 11:55:17$#value はあくまでも最後の添え字として扱うべきで、
$#value + 1 を要素数として使うべきではないって偉い人が本に書いてた。
0244デフォルトの名無しさん
2006/11/13(月) 11:55:230245デフォルトの名無しさん
2006/11/13(月) 11:56:250246デフォルトの名無しさん
2006/11/13(月) 11:57:43>>235のゆうように比較対象を配列にいれて、
勝ち抜き合戦を一回ループすればおk
最小値を求めるのも同じ。
ソートはまた別の話だから混乱しないように。
パールっつよりプログラミングの基本テクニック
だから、どこにでも参考資料はあると思うよ
0247デフォルトの名無しさん
2006/11/13(月) 12:10:14ブロック引数を与えたらブロックの値を最大or最小にする要素を
返してくれれば便利なのになといつも思う。
min { $x[$_] } 0..$#x
みたいに使うイメージで。
0248デフォルトの名無しさん
2006/11/13(月) 12:11:370249デフォルトの名無しさん
2006/11/13(月) 12:42:07それぐらいならこれでいいじゃん
0250デフォルトの名無しさん
2006/11/13(月) 12:50:45添え字が欲しいんじゃなかったっけ? それだと値のほうになってしまうよ。
reduce { $x[$a] < $x[$b]? $a: $b } 0..$#x
でもいいんだけど$aだの$bだの何度も書くの面倒だし。
0251デフォルトの名無しさん
2006/11/13(月) 12:57:490252デフォルトの名無しさん
2006/11/13(月) 13:34:480253デフォルトの名無しさん
2006/11/13(月) 14:30:21処理可能な数値の最大最小を表す定数なり
特殊変数はないん?
0254デフォルトの名無しさん
2006/11/13(月) 14:40:38use POSIX
0255デフォルトの名無しさん
2006/11/13(月) 15:47:36|
|
|
∧|∧
( / ⌒ヽ | ̄ ̄ ̄ ̄ ̄ ̄ ̄
| | | |
∪ / ノ . |
ノ ノ ノ */
main (
)
{
}
0257デフォルトの名無しさん
2006/11/13(月) 20:12:160258デフォルトの名無しさん
2006/11/13(月) 21:50:470259デフォルトの名無しさん
2006/11/13(月) 22:19:480260デフォルトの名無しさん
2006/11/13(月) 22:51:09普通にできる
0261デフォルトの名無しさん
2006/11/13(月) 22:51:330262デフォルトの名無しさん
2006/11/14(火) 02:23:45ありがとうございます。
hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると
Argument "ホゲホゲ 5" is not numeric in array element at ./a.pl, <> line 28
の用にエラーが出ます。
何がいけないのでしょうか?
0263デフォルトの名無しさん
2006/11/14(火) 02:39:27> 独習終えたら何を読むといいですかね?
主要モジュールや最近バリバリ書かれているとんがったシステムのソースコード。
0264デフォルトの名無しさん
2006/11/14(火) 02:42:13> hashのkeyに半角の空白を含む日本語を入れてvalueに数値を入れると
ホントか? ホントにそう書いてあるか?
0265デフォルトの名無しさん
2006/11/14(火) 02:54:07hashに 「ホゲホゲ 5」 をいれて
keyに 「10」 を入れた時に以下のエラーが出ます。
日本語の取り扱いが間違ってるのでしょうか?
Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1.
0266デフォルトの名無しさん
2006/11/14(火) 03:07:060267265
2006/11/14(火) 03:16:46#!/usr/bin/perl -w
# hash----------------------------
%cn2p;
while(<>){
chomp;
# print "$_\n";
@words = split;
# print "n1 $words[0]\n";
# print "n2 $words[1]\n";
# print "n3 $words[2]\n";
$tmp = $words[1] . " " . $words[2];
$cn2p[$tmp] += $p;
}
0268265
2006/11/14(火) 03:18:44間違い。
簡略化したのでエラーが出るのは最後の行です。
10 ホゲホゲ 5
と言うのをファイルから読ませています。
#!/usr/bin/perl -w
# hash----------------------------
%cn2p;
while(<>){
chomp;
# print "$_\n";
@words = split;
# print "n1 $words[0]\n";
# print "n2 $words[1]\n";
# print "n3 $words[2]\n";
$tmp = $words[1] . " " . $words[2];
$cn2p[$tmp] += $words[0];
}
0269デフォルトの名無しさん
2006/11/14(火) 03:21:21Argument "M-^CzM-^CQM-^CzM-^CQ 5" isn't numeric in array element at ./a.pl line 32, <> line 1.
って、配列の添字に数値じゃないのが入れられてるっていうエラーなんだが。
0270デフォルトの名無しさん
2006/11/14(火) 03:21:56答えを言うのはもったいないので、とりあえず use strict してみようよ。
0271265
2006/11/14(火) 03:28:11hashには数値以外も入れられるんじゃないのでしたっけ?
0272デフォルトの名無しさん
2006/11/14(火) 03:29:44あなたのコードには、hashは存在しません。
0273265
2006/11/14(火) 03:32:54わかりました!
ありがとうございます。
0274デフォルトの名無しさん
2006/11/14(火) 03:46:09答え言っちゃダメでしょw
0275デフォルトの名無しさん
2006/11/14(火) 04:51:23全員が君みたいな性格って訳じゃないみたいだ
0276デフォルトの名無しさん
2006/11/14(火) 08:50:220277デフォルトの名無しさん
2006/11/14(火) 08:56:43ベクターだっけ?
0278デフォルトの名無しさん
2006/11/14(火) 09:03:570279デフォルトの名無しさん
2006/11/14(火) 10:15:56ありがとう
0280デフォルトの名無しさん
2006/11/14(火) 11:25:400281デフォルトの名無しさん
2006/11/14(火) 11:27:32use constant LOG_DIR => './logs';
などの LOG_DIR や 関数呼び出しを書くことは可能ですか?
0282デフォルトの名無しさん
2006/11/14(火) 11:31:07foreach my $value (@log) {
if ($flag) {
undef $value;
}
}
ってやると @log から $valueの要素が削除されるのって仕様なの?
0283デフォルトの名無しさん
2006/11/14(火) 11:51:34削除されたんじゃなくて値がundefになっただけだと思うが、それは仕様。
If any element of LIST is an lvalue, you can modify it by modifying VAR
inside the loop. Conversely, if any element of LIST is NOT an lvalue,
any attempt to modify that element will fail. In other words, the
"foreach" loop index variable is an implicit alias for each item in the
list that you're looping over.
0284デフォルトの名無しさん
2006/11/14(火) 11:52:130285282
2006/11/14(火) 13:47:38ってやっても消えないよね
どうなってんの
0286デフォルトの名無しさん
2006/11/14(火) 13:53:54空文字列の代入
0287282
2006/11/14(火) 14:11:100288デフォルトの名無しさん
2006/11/14(火) 14:16:540289282
2006/11/14(火) 14:54:410290デフォルトの名無しさん
2006/11/14(火) 15:02:03こわいのは自分の無知だろ
0291デフォルトの名無しさん
2006/11/14(火) 15:02:17▓█ ▓█
▓▓██ ▓▓██
▓▓▓▓▓▓▓▓▓▓▓███
▓▓▓██▓▓▓▓▓██▓▓███
▓▓█▓▓▓▓▓▓▓▓▓█▓███
▓▓▓▓█▓▓▓▓▓█▓▓▓███
▓▓▓▓▓█████▓▓▓▓███
▓▓▓▓▓███▓▓▓▓███
▓▓▓▓▓▓▓▓▓███
▓▓▓▓▓▓▓▓▓▓▓▓███
▓▓▓▓▓▓▓▓▓▓▓▓▓▓███
▓▓▓▓▓▓▓▓▓▓▓▓▓▓███
これを見ると今年の大学受験に落ちます。
これを今から1時間以内に3回他スレにコピペすれば100%、受かります。
貼らないと
落 ち ま す
0292デフォルトの名無しさん
2006/11/14(火) 18:30:08できない。できたらかえって困る。here document なんだから。
ただ、$hoge のように「$」から始まっていれば変数置換は評価される。
しかし、$hoge がオブジェクトだったとしても
$hoge->method() としても method() は呼び出されない。
0293デフォルトの名無しさん
2006/11/14(火) 18:32:01>argvのv
釣りにマジレスで Volume。
0294デフォルトの名無しさん
2006/11/14(火) 18:52:32sub sum { $_[0] + $_[1] }
use constant THREE => 3;
print <<_EOF_;
${[sum(THREE,4)]}[0]
_EOF_
0295デフォルトの名無しさん
2006/11/14(火) 19:47:07独創的だな。
普通は @{[ expr ]} か ${\( expr )} だと思うが。
0296デフォルトの名無しさん
2006/11/14(火) 20:15:06を書くのが面倒なのですが、Cのプリプロセッサのようなことは
できないのでしょうか?
0297デフォルトの名無しさん
2006/11/14(火) 20:44:32cpanのshellでinstall Image::Magickと入力するとnmakeが実行されるのですが
windows.hが開けないと言われて終了してしまいます
vc++のインクルードディレクトリにはちゃんとwindows.hのあるディレクトリが指定してあり
vc++のプロジェクトでは普通にwindows.hをincludeすることができます
どうすればインストールできるのでしょうか
0298デフォルトの名無しさん
2006/11/14(火) 21:14:32分かったのですが、Error.pmのエレガントな使い方について
教えてもらえませんか?
0299デフォルトの名無しさん
2006/11/14(火) 21:38:14駄目な理由は、 lib/config_heavy.pl 参照。
自力でコンパイルする時は、perl自体もソースからコンパイルして生成するか
lib/config_heavy.pl と lib/config.pm を適切に修正する必要があるよ。
ActivePerlならppmを使う方法が楽。
自分は Image Magickのwin32パッケージに入ってる奴を入れた。
方法は Image MagickのREADME.TXTに書かれてる。
0300デフォルトの名無しさん
2006/11/14(火) 21:39:38プリプロセッサ相当のことならばFilterモジュールがそれだが…
"Thare's more than one way to do it."
sub __HERE__() {
my (undef, $filename, $line) = caller();
return "$filename:$line:";
}
print __HERE__;
0302デフォルトの名無しさん
2006/11/14(火) 22:59:58caller()で十分でした。ありがとうございます。
0303デフォルトの名無しさん
2006/11/15(水) 01:38:33flock(IN, 2);
@testdata = <IN>;
close(IN);
foreach (@testdata){
$_ =~ s/[\x0D\x0A\r\n]//g;
$_ .= "writed\x0A";
}
open(OUT, "> test.txt");
flock(OUT, 2);
print OUT @testdata;
close(OUT);
exit;
windows上で
こんな感じで「内容が複数行あるテキストファイル」を読み込んで少しだけ改変して
元のテキストファイルに上書きするスクリプトを書いていたのですが、
print OUT @testdata;でファイルへ保存するときに\x0Aが\x0D\x0Aに変換されてしまいます。
改行コードを指定して(この場合は変換せずに\x0Aのままで)保存したいのですが、
テキストファイル保存時の改行コードを指定するにはどうすればよいのでしょうか。
flock後にbinmodeを指定すれば期待通りの動作はしましたが、binmodeを指定せずにできる方法はありませんか。
0304デフォルトの名無しさん
2006/11/15(水) 02:08:150305デフォルトの名無しさん
2006/11/15(水) 03:51:03open OUT, '>:raw', 'test.txt' or die "$!\n";
flockも数字リテラルよりもFcntl.pmを使うのがお薦め。
0306デフォルトの名無しさん
2006/11/15(水) 05:05:31Windows+ActivePerl5.8の環境で、Windows標準の時計(時刻)をPerlで変更することってできますか?
0307デフォルトの名無しさん
2006/11/15(水) 07:29:580308デフォルトの名無しさん
2006/11/15(水) 08:39:58それは、Perlじゃなくて、その、なんていうの、そうゆうのは時計のほうを調べるんだよ。
0309デフォルトの名無しさん
2006/11/15(水) 10:15:47で &test(THREE);ってかくとエラーなんですけどなんでですか?
それと自作関数に&付ける人といない人がいますけど違いってあるの?
0310デフォルトの名無しさん
2006/11/15(水) 10:29:31エラーメッセージはインタプリタが人間に分かるように適切に出す大事な情報なんだよ。
おまえの説明はソースとエラーメッセージを省略してるからエスパーしか状況を把握できんぞ。
助けを求めるときには、おまえではなく他人に分かるように状況を説明しろ。
0311デフォルトの名無しさん
2006/11/15(水) 10:43:26http://www.kt.rim.or.jp/~kbk/perl-5.8/perlfaq7.html#what_s_the_difference_between_calling_a_function_as__foo_and_foo__
http://www.kt.rim.or.jp/~kbk/perl5.005/perlsub.html
0312デフォルトの名無しさん
2006/11/15(水) 11:33:26どこでどのようなエラーが出るのか、省略せずに全部書け。
サブルーチン呼出しで & を付ける必要があるのはそれがサブルーチン名だと
判別できない場合、つまり後ろの () がない状態で使う場合だ。
0313309
2006/11/15(水) 12:42:45サブルーチンのほうはわかりました。
>>209のソース間違えてました。
use constant (PL => 'test.pl');
require PL;
Can't locate PL.pm in @INC (@INC contains: C:/Perl/site/lib C:/Perl/lib .) at te
st.pl line 3.
とでます。PL.pm になってるんですが置き換えできないのでしょうか?
0314デフォルトの名無しさん
2006/11/15(水) 12:54:41サブルーチンの引数とrequireではかなり話が違う。
reqruire PL;
だとrequireに対してベアワードが引数だったときに'.pm'をつけてファイルを探す機能の
方が先に効いてしまうので
reqruire (PL);
などとすればよい。
0315309
2006/11/15(水) 13:01:370316デフォルトの名無しさん
2006/11/15(水) 19:12:32/ '' - ,,
/ '' - ,,
/ ヽ
i / /ヽ !
,i ./ / ''―、 !
i ,、 n て'' ノノ ヾ !
i ノノノ ノ ノ ''´ ! /
�U j ' ´ ノ ( ヽ |
>-,, / ,,=━━・!' ,ノ━== ! ノ
!・ ヽ | ’ニンniii、 :::::i/ィ7iii= i )
\(てi iヽ ^' ~ -' /}
`i_ 、 \ i_ l_j
`┐ i /(,,, ,n 〉 /\\ もうスクリプトっていうレベルじゃねぇぞ!
 ̄ ̄へ ! ' T'' l | \
| ! i ン=ェェi) i ソ )
| i´\! ,, -ェ`、_ン ノノ 〈
| | \\,, `―''´// |
| つ !、_''''''''''''' / 7
0317デフォルトの名無しさん
2006/11/15(水) 22:32:46サブルーチン呼出しよりも定義が先に perl に読まれる場合は () と & を省略可能。
サブルーチン呼出しよりも定義が後に perl に読まれる場合は () か & のいずれかが必要。
いずれの場合でも () または &、もしくはその両方を記述する事ができます。
いずれの場合でも & を付けるとプロトタイプ宣言を無視します。
0318デフォルトの名無しさん
2006/11/15(水) 22:36:570319デフォルトの名無しさん
2006/11/15(水) 22:59:57value1<TD>1<TD>value2<TD>24</TR>
<TD>ほげ<TD>73<TD>/\565
HOGE
;
$string =~ /value1<TD>(.*?)<TD>value2<TD>(.*?)<\/TR>(?:.|[^.])*?ほげ<TD>(.*?)<TD>/;
print(
"value1:$1\n".
"value2:$2\n".
"ほげ:$3\n"
);
これを実行すると
value1:
value2:
ほげ:
と何も表示されないのですが、$stringの中の\565のどれか一つ以上を消す、
パターンの中のほげの前に<TD>をつける、ほげを半角英数に置き換えるのいずれかをすると
value1:1
value2:24
ほげ:73
とうまくいきます。なぜですか?
0320デフォルトの名無しさん
2006/11/15(水) 23:06:24&をつけることによってプロトタイプを無視できる。
0321デフォルトの名無しさん
2006/11/15(水) 23:08:390322317
2006/11/15(水) 23:51:42最大のメリットは定義済か未定義かに加えて、言語組込の予約語との名前衝突を気にしなくてよくなる点ですが、>>317 では意図的に省いています。
でもこれはメリットかどうか微妙というかなんというか…、「やりたければそうすることもできるよ」という「Perl 流」(というよりも UNIX 流) の一例とは言えるでしょう。
常に付けておけば、マイナーな予約語との衝突によるややこしいエラーと格闘せずに済むという点ではメリットかもしれません。
0323デフォルトの名無しさん
2006/11/16(木) 00:00:06$string =~ m{value1<TD>(.*?)<TD>value2<TD>(.*?)</TR>[\r\n]*<TD>ほげ<TD>(.*?)<TD>};
素直に改行をマッチさせるんじゃダメなん?
>>322
予約語との衝突を防ぐのと、プロトタイプチェックされるのとでは、断然後者のほうが有益なような…
それに、衝突のチェックは、例えば構文色分けできるエディタで予約語を色分けすれば防げるよね。
まあ、個人の主観の問題なので、TMTOWTDIってことで……。
0325デフォルトの名無しさん
2006/11/16(木) 00:23:49なんだか面白い現象だね >>319 。
ぼくもよくわからんけど、さしあたり /\\\d\d\d?/ のような文字列が八進表現の文字コードによる文字指定として展開される点については知っていますか?
0326デフォルトの名無しさん
2006/11/16(木) 00:49:19あと、歴史的な理由もなかったかな。
perl4 とか 3の頃では、自作サブルーチンの呼び出しに&は必須だったような記憶が。
0327デフォルトの名無しさん
2006/11/16(木) 00:51:49>>325 の書いてる通り \565 は1つの文字として扱われてるんだけど、
Perl では文字列中に ASCII の範囲で表せない文字(255番以降の文字)が入ってると
UTF-8 の文字列として扱われる。(正確には UTF-8 をPerl独自に拡張した「utf8」)
この時、同じ文字列中にある「ほげ」も UTF-8 に変換されるけど、
その結果、正規表現中の(ファイルのエンコーディングでの)「ほげ」という文字の並びと
変換された「ほげ」が一致しなくなるので、マッチしなくなってしまう。
(しかも、\565 なんてわけがわからない文字と一緒だから、誤変換されてるっぽい)
これを防ぐには、スクリプトファイル自体を UTF-8 エンコーディングで保存して、
頭に use utf8; を付ければよい。文字列もパターンも全てUTF-8で統一されてハッピー。
0328デフォルトの名無しさん
2006/11/16(木) 01:45:12\565 がiso-8859-2(latin2 , 1文字=1バイト)で表現できない文字だから。
なので、$stringはutf8化されて格納される。
正規表現もiso-8859-2扱いだが、正規検索エンジンがutf8化を考慮しないので、
(utf8の仕様上)ASCII範囲外の文字がマッチしなくなる。
0329319
2006/11/16(木) 07:26:41なるほど。
そういうわけだったんですか。
では\565を消さずともほげの前に<TD>を追加するとマッチするのはなぜなんでしょうか?
<TD>に特別な意味はないのであるなしにかかわらず$stringはutf8として扱われ、結果マッチしないと思うのですが。
0330309
2006/11/16(木) 10:31:24use strict;
use constant (STR => 't', FLAG_X => 1);
if (FLAG_X && test()) {
print "OK";
}
sub test {
return 1;
}
Bareword "FLAG_X" not allowed while "strict subs" in use at t.pl line 4.
Execution of t.pl aborted due to compilation errors.
これはなぜなのでしょうか?
複数の定数を定義するとこうなるのですが
0331デフォルトの名無しさん
2006/11/16(木) 11:12:38$file{$num} = [(split)[2..4]];
この場合、splitは何を表しているのでしょうか?
0332デフォルトの名無しさん
2006/11/16(木) 11:38:23use constant {STR => 't', FLAG_X => 1};
0333デフォルトの名無しさん
2006/11/16(木) 11:39:47それ複数の定数の定義になってないし。perldoc constantよく読め。
× use constant (STR => 't', FLAG_X => 1);
○ use constant {STR => 't', FLAG_X => 1};
ちなみに上も便宜上×と書いたがそれはそれで正しい書き方で、
('t', 'FLAG_X', 1)というリストを値とする定数STRを定義したことになる。
0334デフォルトの名無しさん
2006/11/16(木) 11:42:26$_ = "aa bb cc dd ee";
$a = [(split)[2..4]];
print join(",", @{$a}) . "¥n";
-----
cc,dd,ee
0335デフォルトの名無しさん
2006/11/16(木) 11:44:03すべての引数を省略して組み込み関数splitを呼んでるだけ。
引数省略したときどういう意味になるかはマニュアル読め。
0336330
2006/11/16(木) 15:36:410337デフォルトの名無しさん
2006/11/16(木) 16:11:090338デフォルトの名無しさん
2006/11/16(木) 16:20:23言語はケースバイケースで使い分けられるのがよろし。
0339デフォルトの名無しさん
2006/11/16(木) 16:20:480340デフォルトの名無しさん
2006/11/16(木) 17:18:360341デフォルトの名無しさん
2006/11/16(木) 17:27:230342デフォルトの名無しさん
2006/11/16(木) 18:20:550343328
2006/11/16(木) 19:03:09ごめん、嘘書いてた。
iso-8859-2じゃなくてiso-8859-1だよ。
それと、「正規検索エンジンはユニコード/非ユニコード間のマッチが不完全」がより正確。
詳細は、perlソースのrecomp.cやreexec.c付近。
改めて、(328までを理解した前提で)319がマッチしない部分の詳細。
m/(?:.|[^.])*?ほげ/ は「複雑なパターン」の繰り返し+固定文字列として処理される。
この場合、繰り返しの終了判定に「固定文字列の先頭バイトと次の1バイトが一致」
という条件が追加される。
この追加の判定はユニコード/非ユニコード間の比較を考慮していないので、
「固定文字列の先頭バイトがutf8表現でも同じバイト表現」である場合を除き
正しい位置で「複雑なパターンの繰り返し」が終了しなくなる。
具体的にsjisでは「ほ」は 82 d9 で、\x{82}という文字のutf8表現は C2 82
本来繰り返しを終了すべき位置での判定は 82 と C2 になり、繰り返し部分の
処理が継続されてしまう。
eucやuse utf8してない場合のutf8でも似たようなもの。
319の正規表現だと、他の部分はユニコード/非ユニコード間を正しく処理できる。
だから、「(複雑なパターン)*?固定文字列」部分の*?直後に来る文字(固定文字列
の先頭文字)がutf8化しても同じバイト表現になる(=ASCII文字セットに含まれる)
事が、正しくマッチが行われる為の条件になっている。
0344デフォルトの名無しさん
2006/11/17(金) 11:06:23これはどのような動きをしているんでしょうか?
変数名は気にせずに。
0345デフォルトの名無しさん
2006/11/17(金) 11:18:40代入です
0346デフォルトの名無しさん
2006/11/17(金) 11:19:33とはいっても、mojiに代入できるのは1つでは?
0347デフォルトの名無しさん
2006/11/17(金) 11:20:07ハッシュdataのキー$mojiの値を、リスト($num1, $num2)へのリファレンスにしている。
0348デフォルトの名無しさん
2006/11/17(金) 11:22:17key value
moji → num1
moji → num2
ということでしょうか?
data{key}をプリントすれば
num1 と num2が表示されるということでしょうか?
0349デフォルトの名無しさん
2006/11/17(金) 11:27:51perl リファレンス でぐぐるといいかも
0350デフォルトの名無しさん
2006/11/17(金) 11:36:22my $num1 = 3;
my $num2 = 4;
my $moji =tetra;
$data{$moji} = [ $num1, $num2 ];
print("%d",$data{$moji});
perl 実行
%dARRAY(0x85a7c28
何かよくわからない結果になってしまったのですが・・・
0351デフォルトの名無しさん
2006/11/17(金) 11:43:050352デフォルトの名無しさん
2006/11/17(金) 11:43:21デバッグしろ
0353デフォルトの名無しさん
2006/11/17(金) 11:44:040354デフォルトの名無しさん
2006/11/17(金) 11:47:43「perl リファレンス でぐぐるといいかも」ともあるだろ
0355デフォルトの名無しさん
2006/11/17(金) 11:48:430356デフォルトの名無しさん
2006/11/17(金) 11:54:33わからないなら知ったかしないでください
0357デフォルトの名無しさん
2006/11/17(金) 12:05:05どこが間違っているか調べて、それを修正して正しくする。
0358デフォルトの名無しさん
2006/11/17(金) 12:35:21ひと通り見た上でわからない点があれば質問するといいよ
0359デフォルトの名無しさん
2006/11/17(金) 12:41:390360デフォルトの名無しさん
2006/11/17(金) 12:46:18何が?
0361デフォルトの名無しさん
2006/11/17(金) 12:48:17マルチ?
0362デフォルトの名無しさん
2006/11/17(金) 12:50:38ぐぐって1ページ目の全サイトを1日かけて読め
0363デフォルトの名無しさん
2006/11/17(金) 12:55:480364デフォルトの名無しさん
2006/11/17(金) 13:06:27print $data{$moji}->[1];
これでわかっただろ。
0365デフォルトの名無しさん
2006/11/17(金) 13:07:520366デフォルトの名無しさん
2006/11/17(金) 13:37:28できねぇぞ
嘘つくなよ
0367デフォルトの名無しさん
2006/11/17(金) 13:49:200368デフォルトの名無しさん
2006/11/17(金) 14:54:02一から手取り足取り教えてくれるわけないのです。
それくらい初歩的で、調べればいくらでも答えの出てくる質問なのです。
自分に調べる能力がないからって駄々こねて暴れても無駄です。
0369デフォルトの名無しさん
2006/11/17(金) 15:25:55Perl6バージョンアップボタンを押からな
0370デフォルトの名無しさん
2006/11/17(金) 18:40:32for $box (@{$data{$_}}) {
}
すみません、これはどういうことを表しているのでしょうか?
0371デフォルトの名無しさん
2006/11/17(金) 19:44:33リスト@keysの要素をハッシュ%fileのキーにしたときの値のリストの2個目(1番目)の要素によってリスト@keysを昇順にソートし、
ソートされた各値をハッシュ%dataのキーにしたときの値の文字列を名前とするリストの各要素を変数$boxに入れて繰り返すことを
ソートされた@keysの要素でくりかえす
ってことかな。
0372デフォルトの名無しさん
2006/11/17(金) 20:20:35とすると
file[ai][1] <=> [][2]
ん、これは aiとbiを比較してから 昇順にソートして
for $boxの行を実行するのか
それともai からeiを全てが 昇順になるようにその行でソートしてから
for $boxの行を実行するのでしょうか?
0373デフォルトの名無しさん
2006/11/17(金) 22:13:58日本語でおp
0374デフォルトの名無しさん
2006/11/17(金) 22:19:27この場合の比較って
どういう順に比較するのでしょうか?
123456789 があるとしたら
1-2 1-3 1-4 1-5 1-6 1-7 1-8 1-9
2-3 2-4 2-5 2-6 ...
..
8-9 とまで全て比較しているのでしょうか?
0375デフォルトの名無しさん
2006/11/17(金) 22:37:25マニュアル見れ
0376159
2006/11/18(土) 02:16:29$r=int(rand(65536)+1);
で使用した場合
$rでは奇数しか値を取りません。
もしかしてrand関数は32768までしかランダムで撮りませんか?
仮に$r=int(rand(32769)+1);
にすると32769のみ値をとりませんでした。
これを解消して65536までのランダム関数にしたい場合は
$r=int(rand(32768)+1)+int(rand(32768)+1);
にするしかないんでしょうか?もっとうまい具合の方法があったら教えてください
0377デフォルトの名無しさん
2006/11/18(土) 02:17:36申し訳ありません
0378デフォルトの名無しさん
2006/11/18(土) 04:25:11つ perldoc -f rand
RANDBIT値の確認は、use Config "config_vars"; で print config_vars('randbits'); 付近。
この値が15なら 2^15通り,48なら2^48通りの値を(rand関数は)返す。
対策ならば、それよりは
int((unpack('L',pack('CCCC',rand(256),rand(256),rand(256),rand(256)))/4294967296*65536)+1);
や
int(rand(256))*256+int(rand(256))+1;
の方が多少マシだと思う。
質の良い乱数が必要ならば専用のモジュールをあたるべき。
0379デフォルトの名無しさん
2006/11/18(土) 04:40:230.56646728515625
0.523223876953125
0.143218994140625
0.589141845703125
0.5029296875
0.998626708984375
0.325347900390625
0.82904052734375
0.5904541015625
0.816375732421875
これらに65536を掛けると全て偶数でかつ整数
どゆううこと?
0380デフォルトの名無しさん
2006/11/18(土) 10:33:030381デフォルトの名無しさん
2006/11/18(土) 10:43:44無いが、substrでポレポレしれ。
0382デフォルトの名無しさん
2006/11/18(土) 10:53:070383デフォルトの名無しさん
2006/11/18(土) 10:58:04ありがとうございます。
解決しました。
# substrってs///で代用出来る思うんですが、何かメリットあるんでしょうか?
0384デフォルトの名無しさん
2006/11/18(土) 11:34:360385デフォルトの名無しさん
2006/11/18(土) 11:58:320386デフォルトの名無しさん
2006/11/18(土) 13:21:500387デフォルトの名無しさん
2006/11/18(土) 15:33:450388デフォルトの名無しさん
2006/11/18(土) 16:13:27つPerl6::Say
0389デフォルトの名無しさん
2006/11/18(土) 17:44:52> 自分で作ればいいじゃない
ワンライナーなときに欲しいよね。
0390デフォルトの名無しさん
2006/11/18(土) 17:58:01perl -le 'print "hage"'
0391デフォルトの名無しさん
2006/11/18(土) 17:59:40ところで、OOP勉強として、モジュールの中身を覗いているのですが、
意外と複雑な物が多いです。初心者が読めるくらいの単純なモジュールのお勧めはないですか?
(レファレンス、パッケージ、オブジェクトの概念はわかります)
「ああ、こういう風に実装してるのか」という実感がつかみたいのです。
perlの勉強で、一番始めにソースを読んでみたモジュールを教えてくださっても構いません。
0392デフォルトの名無しさん
2006/11/18(土) 18:32:04短いのにいろいろ勉強になるテクニック満載
0393デフォルトの名無しさん
2006/11/18(土) 22:43:340394デフォルトの名無しさん
2006/11/18(土) 23:07:150395デフォルトの名無しさん
2006/11/19(日) 00:23:13お助けください。
変数名に変数を使いたいたく、いろいろ試してみたのですがどうもうまくいきません。
$abc="file"として、$iを0,1,2,3,4・・・と増やしたいのです。
$abc$i
${abc"$i"}
${"abc" . "$i"}
など試してみましたが、だめでした。
なにかよい方法ないでしょうか?
0396デフォルトの名無しさん
2006/11/19(日) 00:26:31日本語の文章を入力すると、
ばらされた単語になって出力されるなんていう
便利なモジュールはありませんか?
split の日本語バージョンに相当するものが欲しいのです。
$tmp = "I am a cat.";
@words = split( " ", $tmp);
foreach $word (@words) {
print $word,"\n";
}
とすると、以下の出力が得られます。
I
am
a
cat.
0397デフォルトの名無しさん
2006/11/19(日) 00:27:13$tmp = "我輩はネコである";
@words = jsplit($tmp);
foreach $word (@words) {
print $word,"\n";
}
出力結果:
我輩
は
ネコ
で
ある。
0398デフォルトの名無しさん
2006/11/19(日) 00:54:05日本語で書いてくれ。
>396
日本語の分かち書きだな。Text::ChasenかText::MeCabあたりかな。
0399デフォルトの名無しさん
2006/11/19(日) 01:01:15${"$abc" . "$i"}
0400デフォルトの名無しさん
2006/11/19(日) 01:01:22惜しい。
${$abc . $i}
0401396
2006/11/19(日) 01:49:21http://chasen.aist-nara.ac.jp/chasen/distribution.html.ja
こちらは辞書込みでDLしてインストールですね。
Text::MeCab
http://mecab.sourceforge.jp/
こちらは CPAN のモジュールなんで、PPMで落せるかもとwktk。
その他、Kakasi とかいうモジュールもあるそうですが、
簡単そうなMeCab で頑張ってみます。
ありがとうございました。 >>398 さん
0402395
2006/11/19(日) 02:55:59>>400
ありがとうございます。
無事にできました。
use strict;
を使ってたらエラーが出ましたが、はずしたらうまく動きました。
0403デフォルトの名無しさん
2006/11/19(日) 04:53:05何に使うか知らんが、配列にしたらええやん。
0405デフォルトの名無しさん
2006/11/19(日) 11:21:31皆さんどうやって回避してますか?(たとえば「ー」があると言われる)
文字コードを変換してるのでしょうか?
0406デフォルトの名無しさん
2006/11/19(日) 11:29:160407デフォルトの名無しさん
2006/11/19(日) 11:31:450408デフォルトの名無しさん
2006/11/19(日) 11:32:360409デフォルトの名無しさん
2006/11/19(日) 12:32:03Jcode->convert()
Jcode->new()->euc で変換するのはおk?
0410デフォルトの名無しさん
2006/11/19(日) 12:42:190411デフォルトの名無しさん
2006/11/19(日) 13:17:55そのあたりを扱うフレームワークが作られていたと思ったが。
0413デフォルトの名無しさん
2006/11/19(日) 14:15:52今度、仕事先に導入してみない?って聞いてくる。
0414デフォルトの名無しさん
2006/11/19(日) 14:25:00大学などでは、Javaなどの言語の講義はあると思いますが、
Perlは高等教育、情報科学教育では嫌われている言語ので、
授業などで学ぶ機会は少ないと思います。
perlに詳しい方は、どのような勉強法をされましたか?
皆さん独学ですか?
0415デフォルトの名無しさん
2006/11/19(日) 15:25:31ことプログラミングに関しては、他人に習うということは忘れた方が良い。
0416デフォルトの名無しさん
2006/11/19(日) 15:29:28いまだに sprintf() を使ってしまう。
printf( "%d\n" $hogehoge); と書く癖が抜けない。
0417デフォルトの名無しさん
2006/11/19(日) 15:49:070418デフォルトの名無しさん
2006/11/19(日) 15:51:03自分で習得しやがらない阿呆ための救済策だ。
0419デフォルトの名無しさん
2006/11/19(日) 17:09:070420デフォルトの名無しさん
2006/11/19(日) 17:09:200421デフォルトの名無しさん
2006/11/19(日) 17:23:19勉強し続けなきゃろくなことできないからな
0422デフォルトの名無しさん
2006/11/19(日) 17:27:51情報系の大学では、言語の講義なんておまけだよ。
もう書いている人がいるように、尻拭い的。
0423デフォルトの名無しさん
2006/11/19(日) 17:49:04for $box (@{$data{$_}}) {
}
これって、{$a},{$b} には最初に何が入るのでしょうか?
@kes の要素の1番めと1番めですか?
その次が2番めと2番めですか?
0424デフォルトの名無しさん
2006/11/19(日) 18:12:28訊いてるヒマがあったら調べろよ。
0425デフォルトの名無しさん
2006/11/19(日) 18:36:07宣言しているつもりなのですが、エラーになってしまいます。
何がいけないのでしょうか?
[エラー内容]
Global symbol "$FOO" requires explicit package name at test.pl line 11.
Execution of test.pl aborted due to compilation errors.
[test.pl]
#!/usr/bin/perl
use strict;
use warnings;
require "config.pl";
&main();
sub main {
print($FOO);
}
[config.pl]
my $FOO = "aaaaa";
1;
0426デフォルトの名無しさん
2006/11/19(日) 18:44:15そっくりそのまま返す
0427デフォルトの名無しさん
2006/11/19(日) 18:49:02myはグローバル変数ではなくレキシカル変数の宣言だよ。
グローバル変数の宣言はourを使え。
詳細は
perldoc -f my
perldoc -f our
0428デフォルトの名無しさん
2006/11/19(日) 18:51:59どう見ても$FOOをファイルconfig.pl内にローカル化しています。
0429デフォルトの名無しさん
2006/11/19(日) 18:58:10これってどういう意味なのでしょうか?
for文ではありえない気がするのですが
0430デフォルトの名無しさん
2006/11/19(日) 19:26:36普通 for $data (@datas) {} だし、
それ以前にdataの複数形ってなんだ
@datasの要素を1つずつ$dataに代入し、ブロックを実行します
foreach $data (@datas) {} と等価です
0431デフォルトの名無しさん
2006/11/19(日) 19:35:190432デフォルトの名無しさん
2006/11/19(日) 20:15:15( ・∀・)つ〃∩ ヘェーヘェーヘェー
0433デフォルトの名無しさん
2006/11/19(日) 20:26:16特定言語の講義なんてなかったよ?
具体的な実装例としてオマケ的には使うけど。
0434デフォルトの名無しさん
2006/11/19(日) 21:38:34ourにしてみましたが同じエラーになります。
>>428
>どう見ても$FOOをファイルconfig.pl内にローカル化しています。
具体的にはどのようにすればいいでしょうか?
0435デフォルトの名無しさん
2006/11/19(日) 22:00:51427はレキシカル変数とグローバル変数は違うよって説明でしょ。
perldoc読んでないでしょ?
エラーをなくしたいのであれば
test.plのrequireをBEGINで囲って、
config.plのグローバル変数はourじゃなくてuse vars使って定義してみ。
0436デフォルトの名無しさん
2006/11/20(月) 00:17:410437デフォルトの名無しさん
2006/11/20(月) 00:20:470438デフォルトの名無しさん
2006/11/20(月) 01:49:59windowsのperlで、wavかmp3のサウンドを鳴らせる方法はあるでしょうか?
もしあれば、ご教授よろしくお願いします。
0439デフォルトの名無しさん
2006/11/20(月) 01:51:10つWin32::Sound
0440デフォルトの名無しさん
2006/11/20(月) 02:03:48即レスども。
0441デフォルトの名無しさん
2006/11/20(月) 03:03:23ないよね。 言語使ったとしてもそれは素材的な
使用をしてるだけで、本則は基礎理論だし。
基礎が有れば言語が変わったって、数週で対応できるよ。
例えれば、乗る車が変わるのと大差ない。
基本操作知ってれば、あとは車幅感覚や視点高さに慣れるだけ。
0442デフォルトの名無しさん
2006/11/20(月) 10:48:57良い例えだな。免許持ってないけど。
0443デフォルトの名無しさん
2006/11/20(月) 11:20:56Exporter使ってuseでimportできるようにするのが吉。
0444デフォルトの名無しさん
2006/11/20(月) 19:37:41if文の条件式はどう書けばいいでしょうか。
@array = (3, 5, 9, 10);
for (my $i =0; $i <= 20; $i++) {
if () {
# $iが@arrayに含まれている時の処理
} else {
# $iが@arrayに含まれていない時の処理
}
}
0445デフォルトの名無しさん
2006/11/20(月) 19:49:140446デフォルトの名無しさん
2006/11/20(月) 19:56:22チェック用のハッシュを作る
for (@array){$Hash{$_} = 1};
for (my $i =0; $i <= 20; $i++) {
if ($Hash{$i} == 1){
・・・
0447444(嫌な事がありそう)
2006/11/20(月) 21:25:06できました。
ありがとうございました。
0448デフォルトの名無しさん
2006/11/20(月) 21:40:51書き方がわかりません。
/[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]\{2,\}/
これじゃだめですよね。
他にも色々試してみたのですがさっぱりわからないので
どなたかご教授ください。
0449壁|x ・)
2006/11/20(月) 21:51:08#! /usr/pink/perl -w
use strict;
my @array = (3, 5, 9, 10);
{
foreach (1..20) {
if ($array[0] == $_) {
print "Match: $_\n";
}
}
shift @array;
redo if @array;
}
0450448
2006/11/20(月) 21:55:48/[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]\{2,\}/
↓
/([\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]){5,}/
0451デフォルトの名無しさん
2006/11/20(月) 22:25:16普通のブロックにredo使ってるの久々に見たなぁ。redo自体あんま見ないけど。
ただ、破壊してるうえに可読性も悪くなった割には、2重forでぶん回すのと変わってないような。
やっぱりハシュ使った方が効率的かなぁと。@2ch回路的経験
my %hash;
@hash{@Array} = (1) x @Array;
みたいな。。
0453デフォルトの名無しさん
2006/11/20(月) 22:48:27これ何やってるの?
0454デフォルトの名無しさん
2006/11/20(月) 22:58:33では、左被演算子を右被演算子に示す数だけ繰り返したもので構成
される文字列を返します。 リストコンテキストでは、左被演算子
が括弧で括られたリストであれば、リストを繰り返します。
print '-' x 80; # 1 列のダッシュを印字
print "\t" x ($tab/8), ' ' x ($tab%8); # タブに畳み込み
@ones = (1) x 80; # 80 個の 1 を含むリスト
@ones = (5) x @ones; # すべての要素を 5 にする
ttp://www.att.or.jp/perl/man/perlop.1.html より
0455デフォルトの名無しさん
2006/11/20(月) 22:59:17ハッシュのスライスに、必要個数だけ要素を持つリストを代入
ttp://search.cpan.org/~nwclark/perl-5.8.8/pod/perldata.pod#Slices___
ttp://search.cpan.org/~nwclark/perl-5.8.8/pod/perlop.pod#Multiplicative_Operators_
0456デフォルトの名無しさん
2006/11/20(月) 23:12:42ありがとん
0457壁|x ・)
2006/11/20(月) 23:44:36評価してくれてありがとう!光栄です.
また暇だったら,たまーーーにROMらせてもらいます 笑
(2ch鯖監視係。の中の人 乙華麗!)
0459デフォルトの名無しさん
2006/11/21(火) 05:59:32Rubyで書いたスクリプトより遅くなるんですが、どうにかなりませんか?
@a = sort(@a);
sort(@a);
それとも、とすると、すでに何かの変数に代入されてますか?
0460デフォルトの名無しさん
2006/11/21(火) 09:18:02配列代入のコストとソートのコストをどうやって分離して計測したんだ?
0461デフォルトの名無しさん
2006/11/21(火) 13:00:50そういう質問する場合は
・環境
・比較したRubyとPerlのソース
・計測方法
・計測結果
ぐらい出せや。
0462デフォルトの名無しさん
2006/11/21(火) 14:25:57それでIPと日付を暗号化したものが掲示板に表示されるようにしたいんだけど
cryptで暗号可したんですが
半角10文字までの文字だけが暗号可されるみたいで
IPの最初のほうがいっしょのやつはIDがいっしょになって困ってます。
教えてください
0463デフォルトの名無しさん
2006/11/21(火) 14:28:360464デフォルトの名無しさん
2006/11/21(火) 14:32:52マルチ乙
0467デフォルトの名無しさん
2006/11/21(火) 15:11:17cryptよりmd5の方が良いと思う
0468デフォルトの名無しさん
2006/11/21(火) 15:40:09ありが�d
やってみる
0469デフォルトの名無しさん
2006/11/21(火) 15:57:10すみません。具体的には以下のような感じです。処理結果は10回の結果の平均値です。
単純な計測方法なので誤差はあると思いますが…
配列の代入なしで実行した場合はPerlの方が圧倒的に速いのですが
代入処理を入れると一気に遅くなってしまいます…
[環境]
OS: WindowsXP SP2 CPU: Pentium4 2GHz RAM: 1GB
Perl ver: 5.8.3.809 Ruby ver: 1.8.5
[結果]
Perl: 0.078sec (代入なし) 1.391sec (代入あり)
Ruby: 0.219sec
[ソース]
----- Perl -----
$N = 100000;
$s = (times)[0];
srand(time());
@a;
for($i = 0; $i < $N; ++$i){ $a[$i] = rand($N); }
@a = sort(@a); #代入あり
#sort(@a); #代入なし
print((times)[0] - $s);
----- Ruby -----
N = 100000
s = Time.now
srand(Time.now.to_i)
a = []
N.times{ a << rand(N) }
a.sort!
print Time.now - s
0470デフォルトの名無しさん
2006/11/21(火) 16:45:29馬鹿者。
数値のソートは @a = sort @a じゃなくて @a = sort {$a <=> $b} @a だ。
perlに無駄な仕事させてんじゃねぇ。
無駄な仕事ってのは、@aの各要素に対する文字列値の生成の事な。
内部で100000回のsprintfとその倍のmalloc(OSレベル)が発生するので遅くもなるが、
そもそも文字列比較と数値比較では結果が異なる。
0471461
2006/11/21(火) 16:50:59> @a = sort @a
を
my @result;
@result = sort @a;
に変更してみ。
確か古いバージョンのsortはソート対象の配列と
結果受け取りの配列が同じだと極端にパフォーマンスが落ちるってのがあったと思う。
あと演算子を指定しないとデフォルトでは文字列比較になるから
数値比較する場合は
@result = sort {$a <=> $b} @a;
ってしないとソート結果がおかしくなるぞ。
コマンドプロンプト起動して
perldoc -f sort
でsort関数のマニュアルがでるからそれ見れ
0472デフォルトの名無しさん
2006/11/21(火) 16:58:57代入なしのソートって何もしてないんじゃね?
0473461
2006/11/21(火) 17:12:20に「その場でのソート (@a = sort @a)が最適化されました。」
ってあって>>469は5.8.3だからここを>>471の形に直せば
Rubyと同じ処理速度になると思うんだけどなぁ。
結果を教えれ!>469
0474デフォルトの名無しさん
2006/11/21(火) 17:25:42同じにはならんだろうな。
0475デフォルトの名無しさん
2006/11/21(火) 17:29:27レスどうも。言われた通りのコードで実行してみました。
処理速度が倍くらいにアップしましたが、まだ「0.687sec」なのでRubyより遅いです…
やはり配列のコピーの部分がネックになってる様なのですが…
my @r;
@r = sort{$a <=> $b} @a;
ちなみにRubyは配列を代入しても「!」を付けた破壊的メソッド(メソッドの内部で値入れ替え)でも
速度は殆ど変わりませんでした。代入がすべて参照になってるからみたいです。
0476469
2006/11/21(火) 17:35:29あ、言うのを忘れてましたが、新しいコードでは乱数生成の部分は、
int(rand($N));
で行いました。こうすると浮動小数の時より少し速くなりました。
新しいコードは以下です。
$N = 100000;
$s = (times)[0];
srand(time());
@a;
for($i = 0; $i < $N; ++$i){ $a[$i] = int(rand($N)); }
my @r;
@r = sort{$a <=> $b} @a;
print((times)[0] - $s);
0477デフォルトの名無しさん
2006/11/21(火) 17:39:24まぁ代入でRubyより時間が掛かるのは、そりゃそうだろうな。それは仕方ない。
その代わり他の部分で早かったりもするし、スクリプト言語なんてそんなもんさ。
0478デフォルトの名無しさん
2006/11/21(火) 17:40:400479デフォルトの名無しさん
2006/11/21(火) 17:40:46- ruby のソートはクイックソート(多分、間違ってたら指摘よろ)
- perl のソートは ( perldoc -f sort / perldoc sort に書いてある。確定)
- 5.6 以前は quick sort
- 5.8 以降は mergesort
アルゴリズムが違う可能性があるんだよ。
そこまで速度に固執する理由が判らんが、
use sort '_quicksort' ;
宣言して sort { $a <=> $b } @a あたりしてみたら如何?
0480デフォルトの名無しさん
2006/11/21(火) 17:43:060481462
2006/11/21(火) 17:43:53検索したのですが
出てきませんでした
0482デフォルトの名無しさん
2006/11/21(火) 17:45:15Digest::MD5をインストール
0483462
2006/11/21(火) 17:45:58アドレスお願いします
0484デフォルトの名無しさん
2006/11/21(火) 17:46:18あ、標準モジュールか。
まあ、Digest::MD5を使えと。
0485469
2006/11/21(火) 17:49:410.656sec と変わりませんでした。
やはり一番のネックは代入の部分みたいです。これは言語の特徴という事で仕方がないかもしれません。
代入処理を省略すると、0.084sec と一気に速度アップするみたいですので。
0486デフォルトの名無しさん
2006/11/21(火) 17:56:48それ、早い遅い以前にソート処理が処理がスキップされているぞ。
代入の速度を計りたいなら
my @tmp = @a;
でやれば代入自体は大して時間がかかってないのが分かるぞ。
0487469
2006/11/21(火) 18:07:55う〜ん、ではやっぱりソート処理の部分が問題なんですかねぇ…
ちなみにCとC++でもまったく同じものを実行してみましたが
何故かC++の方が処理が速かった…
なんか全部予想外の結果だったなぁ…
環境:VC++6.0
C: 0.046sec
C++: 0.015sec
0488469
2006/11/21(火) 18:19:37PHPはコードの書き方が悪かったのかもしれませんが、遅かったです。
C: 0.046sec
C++: 0.015sec
Ruby: 0.219sec
Perl: 0.687sec
PHP: 0.761sec
0489デフォルトの名無しさん
2006/11/21(火) 18:19:500490470
2006/11/21(火) 18:54:15恥ずかし過ぎるので、ちょっと pp_sort.c 眺めてみた。
>>487-488
@a = sort { 0; $a <=> $b } @a; にすれば、もうちょっと早くなる。
比較部分に付けた 0; は、perlで記述した比較式を使わせるためのおまじない。
(オプティマイザに「複雑な評価式」だと勘違いさせる)
0491デフォルトの名無しさん
2006/11/21(火) 19:08:57なんで sort 文以外の rand やら int やら c 方式の for 文やらが、
評価されてるベンチマークで、「 sort が遅い」と結論付けてんのか
分からん。
0492デフォルトの名無しさん
2006/11/21(火) 19:10:310.594sec
ちょっとスピードアップです。
my @r;
@r = sort{0; $a <=> $b} @a;
あと、use sort '_quicksort' 入れるとどうも遅くなりますね…
0.719sec
0493ぴゅあ
2006/11/21(火) 19:17:37ちょっと気になってみたので書いてみてますが…
2chのIDが日付で変わるとかは知らないですが
暗号化(crypt)としてますけど、符号化の処理としてcryptを利用しているという感じでしょうか
>半角10文字までの文字だけが暗号可されるみたいで
8文字ですよね(かつ下位7ビットとされているらしい)@DESの場合でしょう
生成される文字列が13文字であるというのは、11文字の中に種も含まれているということだろうか?と推測しますが
IPを8文字に収め、種に日付を関連付ければ(基準日から)11年分くらいをその11文字で一意な値として得られそうにも思えますけど、実際には13文字(実質11文字)では足りないような気もします
(実際のDES/MD5の実装までは追えてないので…というか追う必要のあるもの?と思うので追ってない)
# crypt()はパスワード暗号化関数である。
というようなところもあるので、必ず一意となることが保証されているものなのか?と、ちょっと疑問に思ったりもします
パスワードの"暗号化だけ"が目的ではないかと思っているので、必ずしも得られるものが一意であることは重要ではないですよね?
目的は
>IPの最初のほうがいっしょのやつはIDがいっしょになって困ってます。
ということでもあり、ちょっと気になったりです。。。
或いはMD5を使うことでその辺りが保証されてくるものなのか
どうなんでしょう
検証できてない推測だけですけどね
あと、cryptはパスワード暗号化関数で、DES/MD5はどちらを使用するかが選択されるものじゃないかなと思ったりもします
0494462
2006/11/21(火) 19:39:54どうもありがとうございます。
http://multix.jp/html/memo/030525.html
ここに2chのIDについてのっていたのですが
use Digest::MD5;
use Digest::MD5 qw(md5_hex);
sub get_2ch_id {
my $bbskey = shift;
my $rand = shift;
my $ip = $ENV{'REMOTE_HOST'};
my $day = ( localtime )[3];
my $md5 = Digest::MD5->new();
my $ipmd5 = substr( md5_hex( $ip ), -4 );
$md5 -> add( $ipmd5 );
$md5 -> add( $bbs );
$md5 -> add( $day );
$md5 -> add( $rand );
my $id = substr( $md5->b64digest, 0, 8 );
return $id;
}
# printf "ID:%s", &get_2ch_id( 'bbskey', 'rand' );
#
# bbskey は板の名前
# rand は /dev/rand から読み出した16バイトの乱数文字列
# ただし ( localtime )[3] の値がおなじ間は変化しない(再利用する)こと。
↑を使ってテストのつもりでIDを表示してみたら日付で変わるようになったみたいですけど
人のものなのではずしました。
上のようなものを作成するための説明がのってるサイトってありませんかね?
調べてもないんです・・・
0495デフォルトの名無しさん
2006/11/21(火) 20:17:06use sort '_quicksort';
$N = 100000;
push @a, int(rand($N)) for (1..$N);
timethese(10, {
'case1' => sub { @b = sort @a; },
'case2' => sub { @b = sort { $a <=> $b } @a; },
'case3' => sub { @b = sort { 0; $a <=> $b } @a; },
'case4' => sub { sort @a; },
});
---
This is perl, v5.8.8 built for MSWin32-x86-multi-thread
Windows XP SP2 + AMD Athlon 64 2.39GHz
Benchmark: timing 10 iterations of case1, case2, case3, case4...
case1: 4 wallclock secs ( 3.84 usr + 0.02 sys = 3.86 CPU) @ 2.59/s (n=10)
case2: 2 wallclock secs ( 2.16 usr + 0.03 sys = 2.19 CPU) @ 4.57/s (n=10)
case3: 4 wallclock secs ( 4.37 usr + 0.00 sys = 4.37 CPU) @ 2.29/s (n=10)
case4: 0 wallclock secs ( 0.00 usr + 0.00 sys = 0.00 CPU)
(warning: too few iterations for a reliable count)
0; をつけない方が速いみたい。case2 は10回やって平均約0.22msと、なかなかの好タイム。
代入しない case4 はヴォイドコンテキストなので、実行すらされないわけですね。
0496495
2006/11/21(火) 20:30:41N = 100000
a = []
N.times { a << rand(N) }
puts Benchmark.measure{ 10.times { b = a.sort } }
puts Benchmark.measure{ a.sort! }
---
ruby 1.8.5 (2006-11-02) [i386-mswin32]
0.407000 0.000000 0.407000 ( 0.406000)
0.031000 0.000000 0.031000 ( 0.032000)
Ruby は門外漢だけど、こんな感じだろうか。sort!は繰り返しての平均がとれないので1回だけ。
代入付きだと約41ms。in-placeだと約31ms。平均じゃないけど参考までに。
0497デフォルトの名無しさん
2006/11/21(火) 20:35:47main.pl
$val{'mess'} = "hello world\n";
if (1) {
require ''sub.pl";
messprint();
}
---------------------
sub.pl
sub messprint {
print $val{'mess'};
}
1;
---------------------
このように書くとうまく動作しません
どのように記述すればうまくうごくようになるのでしょうか
0498デフォルトの名無しさん
2006/11/21(火) 20:40:10× require ''sub.pl";
○ require "sub.pl";
てかエラーメッセージぐらい書こうよ。
0499デフォルトの名無しさん
2006/11/21(火) 20:43:52main.pl
+my $val{'mess'};
$val{'mess'} = "hello world\n";
sub.plのサブルーチン内でmain.plの変数の参照ができるようにするには
どのようにしたらいいのでしょうか?
0500デフォルトの名無しさん
2006/11/21(火) 20:44:240501デフォルトの名無しさん
2006/11/21(火) 20:45:28じゃないとダメだろう。
0502デフォルトの名無しさん
2006/11/21(火) 20:53:07ありがとうございます
ローカルにするとだめなんですね
0503デフォルトの名無しさん
2006/11/21(火) 20:57:58> ローカルにするとだめなんですね
ちょwおまvflkmvkぁd
スコープ外で使えたら局所化している意味がないじゃんYO
0504デフォルトの名無しさん
2006/11/21(火) 21:01:53頭沸いてましたw
スッキリー
0505デフォルトの名無しさん
2006/11/21(火) 21:02:38値が欲しいだけなら引数で渡してあげよう。
# main.pl
my %val = ( 'mess' => "hello world\n" );
if (1) {
require ''sub.pl";
messprint($val{mess});
}
# sub.pl
sub messprint {
my $message = shift;
print $message;
}
1;
0506469
2006/11/21(火) 21:17:22今、ActivePerlの最新版で試してみたら
何の工夫もない>>469と同じコードで、軽く 0.203sec 出ました。
どうやら遅い原因の多くは、古いバージョンのせいだったみたいです…
0507462
2006/11/21(火) 21:29:29それを8文字にするほうほうってありますかね?
0508462
2006/11/21(火) 21:59:32自己解決しました。
bbs.cgi再開発プロジェクト Part8
ttp://qb5.2ch.net/test/read.cgi/operate/1149664022/l50
の過去ログにあったような伊予柑♪
ようするに、IPアドレスは端折って入れちゃっているからもちろんのこと被ったりします♪65536通りだったかしら
0510470
2006/11/21(火) 22:33:52>>490は(>>469氏が使っている)v5.8.3での話。
(v5.8.7までは同じ)
ソースを比較しながら読んでみたけど、
perl588delta.pod にある
> provided improvements to reduce the memory usage of C<sort>
> and to speed up some cases.
の中身が「数値比較が指定された時に文字列値を作るのを止めた」のと
「全要素が整数ならば、自動的に整数比較を用いる」でした。
5.8.8以降で {0; $a <=> $b} を指定すると、「複雑な比較式用の呼び出し」を
使うオーバーヘッド分が遅くなるだけです。
5.8.7までなら同時に全要素の文字列化が行われなくなるので、早くなる分と
遅くなる分を加えて、今回の例では早くなったと。
0511デフォルトの名無しさん
2006/11/22(水) 02:23:15駱駝: http://www.oreilly.co.jp/books/4873110963/
これ読むのに
どれくらい時間かかる?
仕事しながら合い間に
休みの日もよむとして
ある程度(中級以下)Perl書ける人間が読むとして
0512デフォルトの名無しさん
2006/11/22(水) 08:21:50人によるだろうけど、リファレンスマニュアルって「読む」ものか?
オレは「読んだ」ことがないから判らんw
0513デフォルトの名無しさん
2006/11/22(水) 08:43:23> 人によるだろうけど、リファレンスマニュアルって「読む」ものか?
> オレは「読んだ」ことがないから判らんw
あれは、純粋にPerlに興味がある人間は、読むなと言われても貪るように読む本だが。
0514デフォルトの名無しさん
2006/11/22(水) 10:34:202,3週使ったハズ。最後の関数リファレンスは軽く流し読みしたけど。
05151/2
2006/11/22(水) 11:50:32{
$str1 =~ /()()()/;
test("ほげ", $1, $2, $3);
} {
$str2 =~ /()()()/;
test("ふが", $1, $2, $3);
}
sub test {
$name = shift;
($hash{$name}{value1}, $hash{$name}{value2}, $hash{$name}{value4}) = @_;
{
$hash{$name}{value2} =~ /()/;
$hash{$name}{value3} = $1 ? $1 : 0;
} {
$hash{$name}{value4} =~ /()/;
$hash{$name}{value5} = $1 ? $1 : 0;
}
}
こういう処理をしたいんですが、このままだと呼び出し元の
$1がサブルーチン内でも有効であって期待通りの動きをしません。
ですので下の用に書き直しましたが、もっと簡潔に書けませんか?
続く
05162/2
2006/11/22(水) 11:52:39my @array;
{
$str1 =~ /()()()/;
@array = ($1, $2, $3);
}
test("ほげ", @array);
} {
my @array;
{
$str2 =~ /()()()/;
@array = ($1, $2, $3);
}
test("ふが", @array);
}
sub test {
# 同じ
}
0517515
2006/11/22(水) 11:58:05sub test {
$name = shift;
(${$hash{$name}}{value1}, ${$hash{$name}}{value2}, ${$hash{$name}}{value4}) = @_;
{
${$hash{$name}}{value2} =~ /()/;
${$hash{$name}}{value3} = $1 ? $1 : 0;
} {
${$hash{$name}}{value4} =~ /()/;
${$hash{$name}}{value5} = $1 ? $1 : 0;
}
}
0518デフォルトの名無しさん
2006/11/22(水) 12:24:55シグナルハンドラを設定するときのサンプルって、たいてい
local $SIG{INT} = ...
って書いてあるけど、なんでlocalがいるの?
$SIG{INT} = ...
だけじゃダメなん?
うわ、一行ごとの改行書き込みになってしまった。
0519デフォルトの名無しさん
2006/11/22(水) 12:42:22意味のないブロック使うなよ、質問はもっと具体的に書いてくれ。
お望みのものはこんな感じか?
==================
sub test{
my $name = shift ;
my %hash ;
$hash{$name} = {
value1 => $_[0],
value2 => $_[1],
value3 => $_[1] =~ /(c)/ ? $1 : 0 ,
value4 => $_[2],
value5 => $_[2] =~ /(o+)/ ? $1 : 0 ,
} ;
print $1 . "\n" ;
return %hash ;
}
my $str = 'hoge-fuga-foo' ;
use Data::Dumper ;
print Dumper { test( "ほげ", $str =~ /(\S+)-(\S+)-(\S+)/ ) } ;
0520デフォルトの名無しさん
2006/11/22(水) 13:03:05あとで値を元に戻す必要がなけりゃlocalなくてもいいよ。
プログラムの一部分でだけ有効にしたいときはブロックで
囲んでlocalにしとけばブロック抜けるときに勝手に戻るので
いちいち退避用の変数用意したり戻し忘れないように気を
つけたりといった手間がいらないから楽というだけのこと。
0521デフォルトの名無しさん
2006/11/22(水) 13:03:21&a({ 'mode' => '1', 'test' => 'あ' });
sub a {
my %f = shift;
print $f{'mode'};
}
うまく受け取れないのですがどうすればいいでしょうか?
0522デフォルトの名無しさん
2006/11/22(水) 13:13:34print $f->{'mode'};
0523デフォルトの名無しさん
2006/11/22(水) 13:41:160524デフォルトの名無しさん
2006/11/22(水) 14:20:36どっちがいいんだろう?
&a( ( 'mode' => '1', 'test' => 'あ' ) );
sub a {
my %f = @_;
print $f{'mode'};
}
0525デフォルトの名無しさん
2006/11/22(水) 14:22:340526デフォルトの名無しさん
2006/11/22(水) 14:50:59thx. ↓以下検証コード。
----------
local $SIG{INT} = sub { print "1\n"; }
sleep(10);
print "in\n";
{
local $SIG{INT} = sub { print "12\n"; }
sleep(10);
}
print "out\n";
sleep(10);
1;
__END__ ################################
C:\Docum...>test.pl
1
in
12
out
1
C:\Docum...>
0527515
2006/11/22(水) 15:21:54それはどうやって使うんですか?
下のようにしても上書きされてしまいます。
%hash = test("ほげ", $str =~ /(\S+)-(\S+)-(\S+)/);
%hash = test("ふが", $str =~ /(\S+)-(\S+)-(\S+)/);
$hash{名前}{要素}の用に使いたいです。
ブロックは$1のスコープを狭める為に使いました。
0528515
2006/11/22(水) 16:01:38sub setInfo {
$name = shift;
$info{$name} = {
value1 => $_[0],
value2 => $_[1],
value3 => $_[1] =~ /(c)/ ? $1 : 0 ,
value4 => $_[2],
value5 => $_[2] =~ /(o+)/ ? $1 : 0 ,
} ;
}
my $str = 'hoge-fuga-foo';
setInfo("ほげ", $str =~ /(\S+)-(\S+)-(\S+)/);
setInfo("ふが", $str =~ /(\d+)-(\d+)-(\d+)/);
$1のスコープの問題も無く、簡略化できました。
とても参考になりました。
ありがとうございました。
0529デフォルトの名無しさん
2006/11/22(水) 16:42:03ppmを使って、
install time-hires
install io-zlib
install win32-api
install http-lite
install Win32-Sound
install getopt-long
これらを一行ずつ打ち込みたいのですが、うまくいかず
Error installing package time-hires : could not locate a PPD file for package time-hires
となってしまいます。
どうやれば正しくインストールできることができるのでしょうか?
ご教授お願いします・・・。
0530デフォルトの名無しさん
2006/11/22(水) 17:05:54お前さんがいいなら、まあいいが……
参考までに hash の merge は、
my %hash = ( %hashA, %hashB ) ;
なんかで実現出来る。527 の例だと
my %hash = test("ほげ", $str =~ /(\S+)-(\S+)-(\S+)/);
%hash = ( test("ふが", $str =~ /(\S+)-(\S+)-(\S+)/), %hash ) ;
0531デフォルトの名無しさん
2006/11/22(水) 17:11:16どこが駄目なのかわからんから適当に弄ってたら
もう何やってんだかわからん
Help me!!
0532デフォルトの名無しさん
2006/11/22(水) 17:31:370533デフォルトの名無しさん
2006/11/22(水) 17:34:38ハッシュのマージだけど、巨大なハッシュならeachでまわした方がメモリ食わないんじゃないか?
>531
何がどうわからんのか書かないことには答えようがない。
0534530
2006/11/22(水) 17:49:02each とコレ↓とどっちがメモリ食わないんだろ?
@hash{ keys %hashA} = values %hashA ;
まあ、そこまで巨大 hash を使うなら、hash の merge なんてせずにすむ様に
コードの最適化を優先するがw
0535デフォルトの名無しさん
2006/11/22(水) 18:01:10cookbook に each が一番って書いてあった
0536515
2006/11/22(水) 20:45:52どちらにも同じ値が代入されてしまいます。解決策を教えてください。
value2 => $_[1],
value3 => $_[1] =~ /(\S+)/ ? $1 : 0,
value4 => $_[2],
value5 => $_[2] =~ /(.)/ ? $1 : 0,
結果
'value4' => 'foo',
'value5' => 'f',
'value1' => 'hoge',
'value3' => 'f',
'value2' => 'fuga'
期待する結果は
'value4' => 'foo',
'value5' => 'foo',
'value1' => 'hoge',
'value3' => 'f',
'value2' => 'fuga'
環境:WindowsXP SP2, Active Perl v5.8.8 built for MSWin32-x86-multi-thread
0537デフォルトの名無しさん
2006/11/22(水) 20:56:25出しゃいいだけだろが。
sub test{
my $name = shift ;
my %hash ;
$hash{$name} = {
value1 => $_[0],
value2 => $_[1],
value4 => $_[2],
} ;
$hash{$name}->{value3} = $_[1] =~ /(\S+)/ ? $1 : 0 ,
$hash{$name}->{value5} = $_[2] =~ /(.)/ ? $1 : 0 ,
return %hash ;
}
0538519
2006/11/22(水) 21:17:50my ( $tmp1, $tmp2 ) ;
$hash{$name} = {
value1 => $_[0],
value2 => $_[1],
value3 => $_[1] =〜 /(\S+)(?{ $tmp1 = $^N })/ ? $tmp1 : 0 ,
value4 => $_[2],
value5 => $_[2] =〜 /(.)(?{ $tmp2 = $^N })/ ? $tmp2 : 0 ,
} ;
実行せずに書きこむもんじゃねえな、
っつーか元の $str1, $str2 及び/()()()/ の中身を教えてくれよ。
0539デフォルトの名無しさん
2006/11/22(水) 21:19:48ちなみに余談だが、C++が爆速なのはインライン関数のせいからだと思われる。
テンプレートと相まって、例えC99のインライン関数をもってしてもC++にはかなわないはず。
0540デフォルトの名無しさん
2006/11/22(水) 21:44:55----- C -----
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 100000
int compare(const void *a, const void *b){ return *(int*)a - *(int*)b; }
int main(void){
int a[N];
clock_t s = clock();
srand((unsigned int)time(NULL));
for(int i = 0; i < N; ++i){ a[i] = rand() % N; }
qsort(a, N, sizeof(int), compare);
printf("%f\n", (float)(clock() - s) / CLOCKS_PER_SEC);
return 0;
}
----- C++ -----
#include <iostream>
#include <vector>
#include <algorithm>
#include <time.h>
#define N 100000
using namespace std;
int main(void){
clock_t s = clock();
srand((unsigned int)time(NULL));
vector<int> a;
for(int i = 0; i < N; ++i){ a.push_back(rand() % N); }
sort(a.begin(), a.end());
cout << (float)(clock() - s) / CLOCKS_PER_SEC << endl;
return 0;
}
0541デフォルトの名無しさん
2006/11/23(木) 00:25:44そうそう、STLのsortはそういうわけで早いわけ。アルゴリズムは(同じコンパイラならおそらくは)同じだとしてもね。
0542デフォルトの名無しさん
2006/11/23(木) 00:31:10使い方が判らなくて困ってしまいましたよ。
まあ、必要な所 (GD, DBI::ODBC, ..) は最初から入ってたんで
ラッキーでしたけどね。
0543デフォルトの名無しさん
2006/11/23(木) 00:44:31CUIも使えるよ
0545デフォルトの名無しさん
2006/11/23(木) 01:54:580546デフォルトの名無しさん
2006/11/23(木) 03:02:57詳しく。
CUI の方がやっぱ慣れてていいんです。
コマンドプロンプトから
>ppm-shell <改行>
とかするのかな?
0547デフォルトの名無しさん
2006/11/23(木) 03:06:32聞くより試したほうが早くね?
0548デフォルトの名無しさん
2006/11/23(木) 03:14:590549デフォルトの名無しさん
2006/11/23(木) 04:31:370550デフォルトの名無しさん
2006/11/23(木) 10:10:22while(<IN>){
print;
}
close(IN);
これでプログラムと同一フォルダ内のtest.txtの内容を表示しようと思ったのですが、
openのところで失敗しているようで、うまく行きません。
どうやらtest.txtというファイルが存在しないとみなされているようです。
試しに、openで新しいファイルを作っても、プログラムと同じフォルダにはできず、
パソコンのどこにファイルが生成されているのか分かりません。
何がまずいのか全く見当が付きません。ご指導願います。
0551デフォルトの名無しさん
2006/11/23(木) 10:12:51ていうかどうやって実行したわけよ。
0552デフォルトの名無しさん
2006/11/23(木) 10:34:06perl "プログラムのアドレス"
で実行しました。
すみません、カレントディレクトリについてはよく分かりません...
0553デフォルトの名無しさん
2006/11/23(木) 10:35:50> パソコンのどこにファイルが生成されているのか分かりません。
まずそれを調べろよ。
0554デフォルトの名無しさん
2006/11/23(木) 10:49:02区切り文字に\を使用していたのがいけなかったようです。
しかし、デフォルトではカレントディレクトリはどこに指定されているのでしょうか?
いままではプログラムとおなじフォルダだと思っていました。
ファイルの生成される場所は、自分のパソコン内の整理が悪いためによく分からない事になってしまっています。
0555デフォルトの名無しさん
2006/11/23(木) 10:57:14subの$_などはCのポインタと考えていいんですよね?
sub t {
my $a = $_[0];
$a = $_[0] = "あ";
}
つまりCでconst みたいにするにはいったん別の変数に移したほうがいいってことですよね?
0556デフォルトの名無しさん
2006/11/23(木) 11:01:07> subの$_などはCのポインタと考えていいんですよね?
ちがう。
0557デフォルトの名無しさん
2006/11/23(木) 11:03:25> しかし、デフォルトではカレントディレクトリはどこに指定されているのでしょうか?
ひょっとしてあなたが何かコマンドを打ち込んで Enter を押すたび、画面に次のような邪魔くさい文字列が表示されませんか?
C:\Documents and Settings\554>
> ファイルの生成される場所は、自分のパソコン内の整理が悪いためによく分からない事になってしまっています。
例えば「未整理のファイル群から特定のファイルを探す」ような非生産的な単純作業をやってくれるのが、コンピュータという道具です。
0558デフォルトの名無しさん
2006/11/23(木) 11:16:22@_ # 組込みの特殊変数。サブルーチンの引数のエイリアスのリストが自動で格納される。
$_[0] # @_ の 0 番目の要素。
@_[0] # @_ の 0 番目の要素のみを含む配列スライス。
そしてこれらは Perl の組込みの特殊変数 $_ とは関係ありません。
0559デフォルトの名無しさん
2006/11/23(木) 11:19:31表示されています。つまりこれがカレントディレクトリと言う事でしょうか。
ということで探してみるとそのフォルダにファイルが生成されていました。
つまりperlの問題じゃなかったと言う事ですね、すみません。
コンピュータに効率的にファイルを探させる事は、自分の力不足でちょっと難しかったです。
0560デフォルトの名無しさん
2006/11/23(木) 12:41:21> コンピュータに効率的にファイルを探させる事は、自分の力不足でちょっと難しかったです。
・スタートメニュー -> 検索 -> ファイルやフォルダ
・マイコンピュータからCドライブ開いてCtrl+Fでエクスプローラの右に検索
perlを覚える前に利用しているシステム(OS)の最低限の利用方法覚えることを推奨します。
0561デフォルトの名無しさん
2006/11/23(木) 13:49:07できました。
ありがとうございました。
中身は私的な物なのでごめんなさい。
0562デフォルトの名無しさん
2006/11/23(木) 20:24:55そこまでは24ビットなんだけども
Anotateで文字を埋め込んだ瞬間24ビットから32ビットに
勝手に変わってしまうという現象に悩まされてる.
それか,32ビットから24ビットに直すいいツールしりませんか?
convert -format BMP24+ a.bmp b.bmp
とやってもうまくいきませんでした.
0563デフォルトの名無しさん
2006/11/23(木) 20:26:30O Annotate
0564233
2006/11/24(金) 17:01:38>>233のどの変数が一番小さいのかを調べる方法がまだ分かりません。
どなたか、お知恵を拝借させてください。
0565デフォルトの名無しさん
2006/11/24(金) 17:23:28$minimum = min ($number1, $number2, $number3);
0566デフォルトの名無しさん
2006/11/24(金) 17:34:000567デフォルトの名無しさん
2006/11/24(金) 17:39:25勉強してもスクリプトにいかせられないんだったら、わざわざ書かなくていいよ。
0568デフォルトの名無しさん
2006/11/24(金) 18:52:17>>233を読むと分かると思いますが後者です。
現在以下のような応急処理を行っているのですが、
要素が増えていけばif文がどんどん増えていくので、
何かいい方法はないのかなと。
$hoge = 3;
$huga = 92;
$foo = 2;
$bar = 39;
@hoge = (
$hoge,
$huga,
$foo,
$bar
);
$min = ソートサブルーチン(@hoge);
if ($min == $hoge) {
print "\$hogeが一番小さい\n";
} if ($min == $huga) {
print "\$hugaが一番小さい\n";
} if ($min == $foo) {
print "\$fooが一番小さい\n";
} if ($min == $bar) {
print "\$barが一番小さい\n";
}
0569デフォルトの名無しさん
2006/11/24(金) 18:56:24> 何かいい方法はないのかなと。
最小の値を抽出すればいいだけ。
0570デフォルトの名無しさん
2006/11/24(金) 18:59:39my $number = [
{name=>'number1',value=>8},
{name=>'number2',value=>3},
{name=>'number3',value=>4},
];
my $minimum = [sort { $a->{'value'} <=> $b->{'value'} } @$number]->[0]->{'name'};
print "$minimum が最小";
こんなのはどうかね?
最初に名前を付ける必要があるけど。
>>569
値じゃなくて名前が欲しいって書いてね?
0572デフォルトの名無しさん
2006/11/24(金) 19:03:33あのさあ、普通、不定個の変数のシリーズがある場合には、
配列に入れるんだけど。
で、「どの変数に?」に相当するのはインデックス番号を取得するプレイになる。
あなたはものすごく変なことをしてるんだけど、敢えてやってるの?
0573デフォルトの名無しさん
2006/11/24(金) 19:10:51それは何基準?
値じゃなくてラベルが欲しい場合は連想配列のほうがいいと思うんだけど・・・
まぁちょっと考えすぎかな、とは思うけど
質問内容見ればそんなに慣れてないってわかるでしょ
こういう大人が子供をダメにするんだよなあ
0574デフォルトの名無しさん
2006/11/24(金) 19:16:070575デフォルトの名無しさん
2006/11/24(金) 19:16:20具体的にはこういうことがしたいんですが、
要素がこれ以上増えると式が大変な事になるので>>568で対処しています。
ほかに何かいい方法がありますか?
my $applePrice = 100;
my $bookPrice = 500;
my $carPrice = 100000;
if (($applePrice <= $bookPrice) && ($applePrice <= $carPrice)) {
print "リンゴが一番安いです。\n";
} elsif (($bookPrice <= $applePrice) && ($bookPrice <= $carPrice)) {
print "本が一番安いです。\n";
} elsif (($carPrice <= $applePrice) && ($carPrice <= $bookPrice)) {
print "車が一番安いです。\n";
}
0576デフォルトの名無しさん
2006/11/24(金) 19:18:170578デフォルトの名無しさん
2006/11/24(金) 19:25:46おk
my $number = [
{name=>'リンゴ',price=>100},
{name=>'本',price=>500},
{name=>'車',price=>100000},
];
my $item = [sort { $a->{'price'} <=> $b->{'price'} } @$number]->[0];
print $item->{'name'} , 'が' , $item->{'price'} , '円で一番安いです';
0579デフォルトの名無しさん
2006/11/24(金) 19:31:420580233
2006/11/24(金) 19:37:49読み終わりました。
こんなコードが良く思いつきますね。
たくさんレスを付けて頂いて、どうもありがとうございました。
>>579
背伸びしてごめんなさい。
0581デフォルトの名無しさん
2006/11/24(金) 19:52:150582デフォルトの名無しさん
2006/11/24(金) 19:54:01どうして?
0583デフォルトの名無しさん
2006/11/24(金) 20:05:31ある要素が配列の何番目にあるかを求める関数もそろってる。
0584デフォルトの名無しさん
2006/11/24(金) 20:07:350585デフォルトの名無しさん
2006/11/24(金) 20:37:49Perlみたいに
use List::Util;
とかやらなくても良いわけですね。
0586デフォルトの名無しさん
2006/11/24(金) 21:48:27こういう感じで標準エラー出力を変えることってできます?
0587デフォルトの名無しさん
2006/11/24(金) 22:06:230588デフォルトの名無しさん
2006/11/25(土) 09:48:59突っ込めばとりあえず main の STDERR は STDOUT に全部流れるハズ。
そーじゃなくて、use warnings 時の warning を STDOUT に変更したい
ってんなら、
local $SIG{__WARN__} = sub { print STDOUT @_ } ;
が、586 の質問の仕方だと 587 の云う通り
======
前者の例
*STDERR = *STDOUT ;
print STDERR qq{hoge\n} ;
0589デフォルトの名無しさん
2006/11/25(土) 11:23:200590デフォルトの名無しさん
2006/11/25(土) 12:39:08ファイルサイズなら stat か -s が使える。
フォルダはわからない。
ところで、配列の参照から配列長を知る方法を知りませんか?
$array_ref = \@hoge_array;
( $$#array_ref ?)
0591デフォルトの名無しさん
2006/11/25(土) 13:41:150592デフォルトの名無しさん
2006/11/25(土) 14:35:200593デフォルトの名無しさん
2006/11/25(土) 21:52:200595590
2006/11/25(土) 22:06:37ご回答ありがとうございます。
ようやく見苦しいソースから開放されます。
0596デフォルトの名無しさん
2006/11/27(月) 01:59:19つまんないね、そういうの。
0597デフォルトの名無しさん
2006/11/27(月) 02:10:46GDの使い方がよくわかりません。
勉強するのに、詳しくて具体例の豊富な書籍かサイトがあったら
教えていただけないでしょうか?
できれば日本語だと助かりますが、英文サイトでも構いません。
0598デフォルトの名無しさん
2006/11/27(月) 02:13:08ttp://blog.livedoor.jp/dankogai/archives/50696852.html
> それとも、編集部は何かPerlに含むところでもあるのだろうか。
> 編集部の猛省を求める。
いったい何様のつもりなんだろう?
0599デフォルトの名無しさん
2006/11/27(月) 02:26:01編集部の人おつかれさまです^^
0600デフォルトの名無しさん
2006/11/27(月) 02:32:21> いったい何様のつもりなんだろう?
編集部は別に偉くないよ。
0601デフォルトの名無しさん
2006/11/27(月) 02:35:42100歩譲って君に考えを合わせたところで、
自分の場所で自分の意見を書くのは責められないだろ。
0602デフォルトの名無しさん
2006/11/27(月) 02:39:270603デフォルトの名無しさん
2006/11/27(月) 02:42:42文句があるなら本人に直接言えばいいし、言えないなら見なかった事にしとけばいいのに。
0604デフォルトの名無しさん
2006/11/27(月) 02:45:01> つまんないね、そういうの。
そんな低レベルなところに面白さを求めるのはダラクですっ!!
志は高く! 下を見るな、上を見ろ!!
0605デフォルトの名無しさん
2006/11/27(月) 02:50:53インサイダーするし、
とばし記事や風説の流布で株価は操作するし、
インタビュー記事では印象操作するし、
あげくのはてに>>598のような2ちゃんを使って自分達を批判するものを貶める工作活動かよ。
モラルが欠け、自浄作用も期待できない以上、さっさと潰れちまえ糞マスゴミ社
0606デフォルトの名無しさん
2006/11/27(月) 02:58:55>>598はどうかと思うが、君は終わってる。
0607デフォルトの名無しさん
2006/11/27(月) 04:52:370608?????
2006/11/27(月) 05:07:220609デフォルトの名無しさん
2006/11/27(月) 10:55:48「バッチファイルの凄いヤツ」って言っちゃったんだけど、大丈夫かな?
(ちなみにPHPはテンプレートの凄いやつと言った記憶があるが)
0610デフォルトの名無しさん
2006/11/27(月) 10:59:41他の新しいスクリプト言語使ったら戻る気にならない。
古いスクリプトの修正くらいしか使わないよ。
0611デフォルトの名無しさん
2006/11/27(月) 11:06:26何使ってるんだ?
pyson?Ruby?
0612デフォルトの名無しさん
2006/11/27(月) 11:09:370613デフォルトの名無しさん
2006/11/27(月) 12:52:17書くのはPerlのほうがいいな。
Rubyで書くときはPerlで書くよりも時間をかけれるときか
あとでもう一回使うばあいか大規模な場合。
0614デフォルトの名無しさん
2006/11/27(月) 17:33:43リファレンス⇔Cのポインタの理解がすごく容易だし、文法もCをふまえて拡張してあるから、
理解しやすいだけでなくそれぞれの知識が実際のコーディングの妨げにならない。
0615デフォルトの名無しさん
2006/11/27(月) 17:38:450616デフォルトの名無しさん
2006/11/27(月) 17:48:040617デフォルトの名無しさん
2006/11/27(月) 18:48:430618デフォルトの名無しさん
2006/11/27(月) 20:29:01古い=枯れていてバグが少ない(エイジングテスト通過済み)
なので、ほめ言葉ですよね^^
0619デフォルトの名無しさん
2006/11/27(月) 21:54:14もし要件満たせなくなれば捨てるだけのこと。
執着など無用だ。
0620デフォルトの名無しさん
2006/11/27(月) 22:06:55簡単に言語を捨てられるなら、その程度のレベルだったという事。
0621デフォルトの名無しさん
2006/11/27(月) 22:16:30捨てるしかないな
0622デフォルトの名無しさん
2006/11/27(月) 22:19:520623デフォルトの名無しさん
2006/11/27(月) 22:37:34なくなったら寂しいな。
0624デフォルトの名無しさん
2006/11/27(月) 22:58:140625デフォルトの名無しさん
2006/11/27(月) 23:23:47ああ、こういう言語憶えるのが目的みたいな人も
いるよね。 まぁ、それはそれでいんじゃない。
いい電動ノコ使いこなしてても、もっといい
チェーンソーが出れば俺は簡単に乗り換えるよ。
電動ノコ名人になりたんじゃなく木を切りたいのでね。
チュンチュン… ハッハッ…
0626デフォルトの名無しさん
2006/11/27(月) 23:38:580627デフォルトの名無しさん
2006/11/27(月) 23:52:47↓↓何事もなかったかのように質問者登場↓↓
0628デフォルトの名無しさん
2006/11/28(火) 00:10:130629デフォルトの名無しさん
2006/11/28(火) 00:10:17頭がおかしいからですか?
0630デフォルトの名無しさん
2006/11/28(火) 00:22:290631デフォルトの名無しさん
2006/11/28(火) 10:39:31っつーかこの議論は他スレでやれっつの
0632デフォルトの名無しさん
2006/11/28(火) 10:50:010633デフォルトの名無しさん
2006/11/28(火) 11:23:33ここなんかどうだ?
http://pc8.2ch.net/test/read.cgi/tech/1162273941/l30
0634デフォルトの名無しさん
2006/11/28(火) 11:29:59なくなったらまた作ればいいじゃない。
0635デフォルトの名無しさん
2006/11/28(火) 13:17:13いえ、その数がゼロではないことを疑問に思っているのではなく、
Rubyコミュニティがあまりにも「そんなのだらけ」なのは何故だろうというのが
訊きたかったことです。
(Rubyの話題のようでいて、Rubyスレで訊いても意味がないことなので、
彼らに噛み付かれることの多いPerlのスレで訊いてみました)
0636デフォルトの名無しさん
2006/11/28(火) 13:44:23邪魔
0637デフォルトの名無しさん
2006/11/28(火) 13:54:44このことから言えることは、 Perl は心の広いおおらかな人が使って
いる言語と言えよう。逆に言えば、Perl は心が広くおおらかでないと
使えない言語ということだ。こうあるべきだと理想ばかりを追求し、
それから外れたらすぐにキーっとなって怒るような人には耐えられ
ないということだ。
もしつき合うなら Perl を使っている人とつき合いたいものだ。
0638デフォルトの名無しさん
2006/11/28(火) 14:16:270639デフォルトの名無しさん
2006/11/28(火) 14:32:29負ける議論ばかり始めるからな。
0640デフォルトの名無しさん
2006/11/28(火) 17:18:280641デフォルトの名無しさん
2006/11/28(火) 17:19:09それPHP信者でもよくあるんだけどPerl使いはPHPやRubyも触っている事が多い
ので他の言語に噛みつかないと勝手に推測している。
おおらかというかじいちゃんみたいな印象がするかな。
2chで言語比較議論になった時のPerlerの交わしテクを見てるとウケる。
0642デフォルトの名無しさん
2006/11/28(火) 17:25:380643デフォルトの名無しさん
2006/11/28(火) 18:58:41パケットキャプチャツール(tcpdump)からの出力を受け取って、
その出力結果をリアルタイムに、その場で加工することが行いたいです。
open(TCPDUMP, "tcpdump |");
while(1){
while(<TCPDUMP>){
#処理
}
}
現在は上記で処理しているのですが、どうしても処理が遅くなります。
なので、tcpdumpから入力があった際に処理を行う事にしたいのです。
初歩的質問で申し訳ないのですが、宜しく御願い致します。
0644643
2006/11/28(火) 19:50:39バッファに溜まったかのような状態になります。
入力があったら即認識し、処理、出力をしたいです。
0645デフォルトの名無しさん
2006/11/28(火) 19:59:42っ[tcpdumpのマニュアル]
0646643
2006/11/28(火) 20:07:45すみません、有難う御座いました。
0647デフォルトの名無しさん
2006/11/29(水) 17:06:36うーん。PHP は最初は Perl で作った CGI だったのにな。
まあいいか。
0648デフォルトの名無しさん
2006/11/30(木) 02:12:58kwsk
というか、php,Perl で検索したら
WEBプログラミングは、PHP/Perl派と、Java派に二分されるとかいう
ブログを見つけてシマタヨ。
http://www.milkstand.net/fsgarage/archives/000803.html
Perl で簡単おきらくごくらくにスクリプト書いていた漏れは
Java 派にケーベツされる訳?! と思ってシマタヨ。
まあ、漏れの本業はWEBプログラミングじゃあなく、、
Perlスクリプトは本業を効率化する為の道具にすぎんので、
Java派にケーベツされようが何しようがいいんだが。
0649デフォルトの名無しさん
2006/11/30(木) 07:27:19資料がなくて困っております。
0650デフォルトの名無しさん
2006/11/30(木) 22:08:39他人のコードを読めるなら、Sledgeで使ってるから(Sledge::Exception)読んでみたら?
0651デフォルトの名無しさん
2006/11/30(木) 22:41:180652デフォルトの名無しさん
2006/11/30(木) 23:43:17初期化でも構いません。
0653デフォルトの名無しさん
2006/11/30(木) 23:51:430654デフォルトの名無しさん
2006/12/01(金) 13:33:04http://www.phpoo.net/index.php?p=history.html#history.php
PHPの歴史
PHP/FI
PHPはPHP/FIというソフトウェアを継承したものです。PHP/FI は1995年に
Rasmus Lerdorfによって作成されました。当初は オンラインに置いてある
彼のレジュメへのアクセスを解析するための Perlスクリプトの単純な組み
合わせでした。彼はこのスクリプト に 'Personal Home Page Tools' と
いう名前を付けました。 さらに多くの機能が要求されるようになると、
Rasmusはデータ ベースとの連携や、簡単な動的ウェブアプリケーションを
作成 できるようなものをC言語で書き直しました。
0655デフォルトの名無しさん
2006/12/01(金) 15:22:09>>まあ、漏れの本業はWEBプログラミングじゃあなく、、
>>Perlスクリプトは本業を効率化する為の道具にすぎんので、
同じく。
鯖缶なので保守用のスクリプトをメインで書いとるよ。
けど、世間ではブラウザで管理するのが流れなのでWeb用も書かないとダメになってきてる。
0656デフォルトの名無しさん
2006/12/01(金) 18:04:29俺のちんけな頭じゃHP、商品売買ぐらいしか思いつかないので
需要があると思わないのだが、この板を見ていると本業にしている
人がちらほら見受けられるので興味がある。
教えてちょ。
0657デフォルトの名無しさん
2006/12/01(金) 19:18:46〜武田信玄 風林火山より〜
0658デフォルトの名無しさん
2006/12/01(金) 19:37:28バックアップ、ドキュメント管理
とかとか色々考えつくけど。
0659デフォルトの名無しさん
2006/12/02(土) 03:12:310660デフォルトの名無しさん
2006/12/02(土) 14:53:41てっとり早くperlを学ぶために最初に読むといい
チュートリアルとか本はありますか?
0661デフォルトの名無しさん
2006/12/02(土) 15:20:32フリーで配付してる掲示板とかのソース。
0662デフォルトの名無しさん
2006/12/02(土) 15:40:04perldoc
フリーで配布してるのもいいけど、KE○Tは駄目。
そんなの読む暇があったらCPAN漁ったほうが楽しいし役に立つよ。
0663デフォルトの名無しさん
2006/12/02(土) 16:38:20・・・でも置いてあるソースまで昔のままの出来なのな。
他の言語を知ってる人間は、恐らく言語のディテールにウェイトを置いて読むだろうから、
2種類のクオートがまったく意味不明な思想で使い分けられてる点とか、
そういうつまらない粗雑さに引っかかって、無用な足踏みをしちゃいそうな気がする。
確かに彼のソースは読むべきではない。
0664デフォルトの名無しさん
2006/12/02(土) 16:40:06UNIX/Linuxの知識があれば、最近出た"Minimal Perl"という本がお勧め。
題名通り、最低限の努力で、すでに知っている知識を活かしながら
perlを学習できる。
0665デフォルトの名無しさん
2006/12/02(土) 16:51:48> ruby, sed, C++など他の言語を知っている人が
> てっとり早くperlを学ぶために最初に読むといい
> チュートリアルとか本はありますか?
『PerlユーザーのためのRuby入門』……あ、逆か。
0666660
2006/12/02(土) 20:32:38>>Minimal Perl
洋書よむ気力はないです。
>>『PerlユーザーのためのRuby入門』……あ、逆か。
いい本だったら逆でも役にたつと思うんですが、amazonレビューの
評価が低いですね…
要所だけを押さえた覚え書きみたいのがあればよかったんですが、
とりあえずそこらのチュートリアルやソースをあさって読む
ことにします。
0667デフォルトの名無しさん
2006/12/02(土) 21:16:56ミスティーネットはどうよ、
Cプログラマの漏れが見様見真似で Perl スクリプトを組み始めたときから愛用している
Perlサイトだ。
http://perl.misty.ne.jp/
関数リファレンスはなかなか秀逸だ
但し、モジュールの使いこなしやら ppm や CPAN モジュールは
ここからもう一歩踏み込まんといかんなあ。
0668デフォルトの名無しさん
2006/12/02(土) 22:13:310670デフォルトの名無しさん
2006/12/02(土) 23:50:570671デフォルトの名無しさん
2006/12/03(日) 01:16:04対する認識不足がある。
10年前、その崖の高さは3メートルだった。ジャンプすれば上によじ登ることが
できたのである。
しかし崖は日々高くなり続けた。早くから昇り始めた人は、ときどき崖が
すこし高くなっていることに気づくと、高くなった分30センチひょいと
登るというのを数多く重ね、崖の上やその上部に留まりつづけている。
だがふもとから見てみよう。崖の高さは今や20メートルに達している。
初心者がふもとから叫んでいる。
「どうやって登ったんですか〜!」
これに
「跳び上がったら上に手が届いたよ〜!」
と叫び返してはいけないのである。
0672デフォルトの名無しさん
2006/12/03(日) 01:38:08>>660の「知ってる」の解釈が
名前を知っているだけなのか、きっちり使いこなしているレベルの知っているのかで
扱いがかなり違うんだよね。
ぶっちゃけ後者なら、2ちゃんで聞くまでもなく自分でtarボールの付属ドキュメントを読んで
すぐにperldocを使って文法やコーディングスタイルよんだりCPANを覚えて
いろいろモジュールをDLして使い方覚えたり、ソースを呼んでコーディングテクニックを身につけたりしてるはず。
0673デフォルトの名無しさん
2006/12/03(日) 02:17:45ラクダ本から入るのはちょっときつくないかな。ま、本格的にやろうと思ったらあれは必須の本だけど。
RubyだとかC++使いこなしてるレベルならいきなりいっても大丈夫か。
あとはPerlクックブックとPerl Best Practicesは必読だな。それだけ読めばあとはもうそれこそCPANのを
片っ端から読んで行くのが一番早いか。
0674デフォルトの名無しさん
2006/12/03(日) 02:27:45もちろん長く深く使い倒したいならラクダが揃ってた方が圧倒的に便利なのは確か。他の物はそれからでもいいよん。
0675デフォルトの名無しさん
2006/12/03(日) 02:31:21俺自身はラクダ本の第2版を買って勉強しはじめたんだが、
今の初心者にいきなり「第3版上下とも買え」っていうのはちょっと酷な気がする
0676デフォルトの名無しさん
2006/12/03(日) 03:57:42文体が独特で最初はとまどったけど、慣れると逆に明解でわかりやすいって思ったなぁ。
網羅的だから、一通り読むと、他の人のソースとかCPANモジュールとかが大体読めるようになってて驚いた。
あと、細かい所まで書いてあるから、細かい疑問の答えも大体載ってて、ありがたい。
でも、やっぱりプログラミング自体初めてっていう人にはキツいと思う。
0677デフォルトの名無しさん
2006/12/03(日) 04:44:45質問者の>>660は
>ruby, sed, C++など他の言語を知っている人が
>てっとり早くperlを学ぶために最初に読むといい
なので、大丈夫でしょ。>>672の前者のタイプだとダメかも知れんけど。
個人的にはperldocでいいじゃんと思うんだけど
>>666で英語読もうともしないヘタレと判明してるので、そうなるとラクダかな。
0678デフォルトの名無しさん
2006/12/03(日) 08:24:04壁は高くなってるかも知れんけど、道具はいっぱい増えてるから。
10年前には、2ちゃんねるなんか無かったし。
そもそも、実際の崖と違って落ちたって死にやしないんだから、
いろいろやってみればいいと思う。その上で、きちんと知りたきゃ
ラクダ本なり、マニュアルなりをあさればいいし。
どうしてもわからい所があれば Google なり2チャンを頼ればいい
と思うぞ。
0679デフォルトの名無しさん
2006/12/03(日) 10:17:26お願いします。
0680デフォルトの名無しさん
2006/12/03(日) 12:09:41>そもそも、実際の崖と違って落ちたって死にやしないんだから、
>いろいろやってみればいいと思う。
崖の比喩は、「落ちたら危ない」という意味ではなく、
「そこにたどり着くまでに困難である」という意味だと思うよ。
道具がいっぱい増えているには同意
Win32環境で、Unix環境とほぼ同じPerl開発・運用ができるようになるとは
10年前には思いもしなかったYO.
今の会社で運用している鯖はWindows2003Serverなんだが、
ActivePerl入れて、CGI使わせて貰っています。
0681デフォルトの名無しさん
2006/12/03(日) 12:58:11使ってもいいんじゃない? PBPにも載ってるくらいだし、確か5.10.xだとコアに入るらしいし。
0682デフォルトの名無しさん
2006/12/03(日) 13:50:41> 崖の比喩は、「落ちたら危ない」という意味ではなく、
> 「そこにたどり着くまでに困難である」という意味だと思うよ。
道具やドキュメントやコミュニティが多くなったこと自体をも指すね。
> >そもそも、実際の崖と違って落ちたって死にやしないんだから、
> >いろいろやってみればいいと思う。
「いろいろ」の種類が多くなり過ぎたことでもある。
0683デフォルトの名無しさん
2006/12/03(日) 14:47:17しかし頂に到るまでの崖のどの高さにおいても、誰もが遊ぶことができる。
少なくとも Perl ではそれが公式に認められているらしいぞ。
0684デフォルトの名無しさん
2006/12/03(日) 14:56:14よくわからんが、公式に認められるとうれしいのか?
0686683
2006/12/03(日) 15:38:28君のようなスーパーハカーには関係ない。
ぼくのような未熟者にとっては「ぼくは Perl について知らないことばかりだけれど、知っている範囲で遊んでもいいのだ」と思える点でうれしいかもしれない。
0687デフォルトの名無しさん
2006/12/03(日) 16:43:50そうだな、
C/C++ は、入門してから遊ぶことが出来までの道程が長いから、
そこで挫ける者も多かろう。
Perl はその道程が短いぶんいいよな。
0688デフォルトの名無しさん
2006/12/04(月) 07:57:510689デフォルトの名無しさん
2006/12/04(月) 09:51:250690デフォルトの名無しさん
2006/12/04(月) 11:00:24誰だよお前w
0691デフォルトの名無しさん
2006/12/04(月) 16:02:48if ($str =~ /foo/) {
# $strのどの場所にマッチしたか(index)知りたい
}
0692デフォルトの名無しさん
2006/12/04(月) 17:17:08if ( $str =~ /foo/ ){
print $-[0] . "\n" ;
}
後は @+ と pos 関数
0693デフォルトの名無しさん
2006/12/05(火) 14:11:23thanks
0694デフォルトの名無しさん
2006/12/05(火) 16:18:06use strict;
use utf8;
open(OUT, '>:encoding(UTF-16LE)', 't:\tmp\16LE.txt') or die;
print OUT "\n";
close(OUT);
↑の処理で"16LE.txt"の内容が16進数で「0D,00,0A,00」になることを期待したのですが
実際には「0D,0A,00」でした。期待した結果を得るはどうしたらいいですか?
XPPro sp2
ActivePerl 5.8.8.817
よろしくお願いします。
0695デフォルトの名無しさん
2006/12/05(火) 16:32:31require 5.8.1;
use strict;
use utf8;
open(OUT, '>:encoding(UTF-16LE):crlf', '16LE.txt') or die;
print OUT "\n";
close(OUT);
手元のlinuxの5.8.8ではこれでいけた。
0696デフォルトの名無しさん
2006/12/05(火) 17:20:44ありがとうございます。早速コピペして実行したのですが、結果は変わりませんでしだ。
試しにFreeBSDの5.8.8でコピペして実行したら期待した結果が得られました。
WinのPerlをインストールし直してやってみます。
0697デフォルトの名無しさん
2006/12/05(火) 17:34:24あー、インストールしなおしても同じだよ、それ。
Cのライブラリ内で行われている改行の変換が原因だから。
(C/OSがテキストモードとバイナリモードを区別しない環境ではPerlIO内で処理される)
">:raw:encoding(utf-16le)" で開いて、最初から print "\r\n" するのが楽だと思う。
0698デフォルトの名無しさん
2006/12/05(火) 18:12:09言われた通りに書き直したら出来ました ! !
ありがとうです。助かりました。
0699デフォルトの名無しさん
2006/12/05(火) 21:00:30バグじゃないかという気がするので
バグレポしたほうがいいんじゃないか。
0700デフォルトの名無しさん
2006/12/05(火) 21:06:08思いっきり「仕様」だろーが。
0701デフォルトの名無しさん
2006/12/05(火) 21:19:162.\nがperl.exeでUTF-16LEの0x0A,0x00に変換される
3.perl.exeが書き込む際にfputsか何かで0x0Aが0x0D,0x0Aに変換される
って認識でおk?
0702デフォルトの名無しさん
2006/12/06(水) 16:22:480703デフォルトの名無しさん
2006/12/06(水) 16:46:56いったん:rawで剥がしてからあとで付け加えるといいらしい。
ttp://blogs.msdn.com/brettsh/archive/2006/06/07/620986.aspx
俺はwindows環境のperl持ってないので試してないが。
0704デフォルトの名無しさん
2006/12/06(水) 16:57:340705デフォルトの名無しさん
2006/12/06(水) 17:25:47perldoc -f binmode
に明記されてる現象の何をもってバグと云うんだ?
(しかも BUGS 等に書いてある訳じゃない。注意書きとして書いてある)
仕様だよ。
0706デフォルトの名無しさん
2006/12/06(水) 17:55:160707デフォルトの名無しさん
2006/12/06(水) 18:05:10英語力無いオレには読みとれん。 Programing Perl 3rd Edition の binmode に
その旨、明記されてない。問題点間違えてない?
まあ、安易にバグだって云うのもなんだかなとは思うが。
0708デフォルトの名無しさん
2006/12/06(水) 18:13:010709デフォルトの名無しさん
2006/12/06(水) 20:47:05駱駝の 3rd は 5.6 ベースの内容で、5.8.x とはかなり違いがある。
5.8.x 使ってるなら perldoc なり >>2-3 に挙がってる訳なりで
確認した方がいいよ。
0710デフォルトの名無しさん
2006/12/06(水) 21:16:31明示的には何も書かれてないように読めた。
705の言っている部分がどこだか示してもらえるとありがたい。
0711デフォルトの名無しさん
2006/12/06(水) 21:30:49The operating system, device drivers, C libraries, and Perl
run-time system all work together to let the programmer treat a
single character ("\n") as the line terminator, irrespective of
the external representation. On many operating systems, the
native text file representation matches the internal represen-
tation, but on some platforms the external representation of
"\n" is made up of more than one character.
0712デフォルトの名無しさん
2006/12/06(水) 21:39:26思いっきり書いてあるだろ。
それとも翻訳させるための釣りか?
The operating system, device drivers, C libraries, and Perl run-time system all work together to let
the programmer treat a single character ("\n") as the line terminator, irrespective of the external
representation. On many operating systems, the native text file representation matches the internal
representation, but on some platforms the external representation of "\n" is made up of more than
one character.
Mac OS, all variants of Unix, and Stream_LF files on VMS use a single character to end each line in
the external representation of text (even though that single character is CARRIAGE RETURN on Mac OS
and LINE FEED on Unix and most VMS files). In other systems like OS/2, DOS and the various flavors
of MS-Windows your program sees a "\n" as a simple "\cJ", but what’s stored in text files are the
two characters "\cM\cJ". That means that, if you don’t use binmode() on these systems, "\cM\cJ"
sequences on disk will be converted to "\n" on input, and any "\n" in your program will be converted
back to "\cM\cJ" on output. This is what you want for text files, but it can be disastrous for
binary files.
0713デフォルトの名無しさん
2006/12/06(水) 22:13:19encoding(...)と:crlfの順序で結果が違ってくるから:rawで
順序調整しないとおかしくなるってあたりの話じゃないだろ。
0714デフォルトの名無しさん
2006/12/06(水) 22:31:32つーか脊髄反射で物事を処理していると上達しないよ。
0715デフォルトの名無しさん
2006/12/06(水) 23:14:09当然だ
今は改行文字の変換についての仕様がperldocに載ってるかどうかの話だろ
:rawの順序云々は>>703が言及してるが、それがperldocに書いてあったとは一言も言っていない
0716デフォルトの名無しさん
2006/12/06(水) 23:22:33windows環境のperlでencodingをUTF16-LEにしたときに\nが0D,0A,00になって
変だっていう>>693が話の始まりなんだから。
とりあえずお前とは話がすれ違ってることはわかった。
0717697
2006/12/06(水) 23:26:27その手があったのか、気が付かなかった。
:encodingを先に指定してから:crlfを指定すれば良かったのか。
中途半端な事を書いてスマンかった >694氏
>>699
バグレポは出さなくても大丈夫だと思いたい。
既に
#36659: UTF-16 endianess switch after line break
http://rt.perl.org/rt3/Public/Bug/Display.html?id=36659
があるから。
0718デフォルトの名無しさん
2006/12/07(木) 06:50:16やっぱり俺はrubyで行こう。
0719デフォルトの名無しさん
2006/12/07(木) 07:15:49PHPとRubyはいまだにバッファオーバーフローのセキュリティホールで
バージョンアップを楽しめるぞ。
0720デフォルトの名無しさん
2006/12/07(木) 10:10:440721デフォルトの名無しさん
2006/12/07(木) 10:43:25それはencodingプラグマのことで。最近話題のPerlIOレイヤのencodingとは
全く無関係ではないが別の話かと。
0722デフォルトの名無しさん
2006/12/07(木) 10:55:17$buf に外部メールサーバから情報をとってきて格納するプログラムを作成して
いるのですが、容量が大きくなりすぎると処理が重くなるので変数の
容量に上限をもうけたいと思っています。
0723デフォルトの名無しさん
2006/12/07(木) 11:21:31ただし、$aか$bのどちらかが0のときは$cに0を代入します。
という課題が出ているのですが、ただし以降がわかりません。
どのように入力すればよいのでしょうか?
0724デフォルトの名無しさん
2006/12/07(木) 11:30:34っつーかまんまだろうが・・・
0725デフォルトの名無しさん
2006/12/07(木) 11:33:30$c = ($a == 0 or $b == 0) ? 0 : ($a > $b) ? $a / $b : $b / $a;
0726デフォルトの名無しさん
2006/12/07(木) 11:41:08tie使えば指定した長さ以上入れようとするとエラーになるスカラーとか作れるけど、
普通は格納するときにlengthをチェックするようにすりゃいいだけじゃねーの?
0727デフォルトの名無しさん
2006/12/07(木) 12:24:22似たようなもんだろ…常識的に考えて…
0728デフォルトの名無しさん
2006/12/07(木) 13:23:38ワロタ
0729デフォルトの名無しさん
2006/12/07(木) 15:00:23( ´,_ゝ`)プッ
0730デフォルトの名無しさん
2006/12/07(木) 15:03:27変数名に$aや$bは使うな、って先生に言ってやれ
0731デフォルトの名無しさん
2006/12/07(木) 18:15:15$number2 = $b;
$answer = $c;
if (($number1 == 0) or ($number2 == 0)) {
$answer = 0;
} elsif ($number1 >= $number2) {
$answer = $number1 / $number2;
} elsif ($number2 > $number1) {
$answer = $number2 / $number1;
}
$c = $answer;
0732デフォルトの名無しさん
2006/12/07(木) 18:38:04$c = 0+eval { pop(@{[sort $a,$b]}) / shift(@{[sort $a,$b]}) };
や
$c = 0+eval { length('a'x$a|'b'x$b) / length('a'x$a&'b'x$b) };
で。
0733デフォルトの名無しさん
2006/12/07(木) 18:54:260734デフォルトの名無しさん
2006/12/07(木) 18:57:13間違ってないがわかり辛いから>>731の書き方のがいい
0735733
2006/12/07(木) 19:01:47すごくわかりやすいと思うんですが・・・
俺もこう書くねーフンフンと思ってたら笑われてて焦りました
if文で複数行で書くかどうかは好みですかね?
0736デフォルトの名無しさん
2006/12/07(木) 19:06:44そう書くなら関数でくるむのが正解
このパターンぐらいなら分かるけど ?が連続するのはちょっとな
0737デフォルトの名無しさん
2006/12/07(木) 19:34:330738デフォルトの名無しさん
2006/12/07(木) 19:45:10思いっきり普通だろ。「宿題の提出にはいじわる」ってんで笑っただけだ。
>>736
>関数でくるむのが正解
臨機応変に使うのが正解じゃねw
0739デフォルトの名無しさん
2006/12/07(木) 19:47:43?:三項演算子の読みやすさって整形次第で結構化けると思うんだ。どうよ?
$c = ($a == 0 or $b == 0) ? 0
: $a > $b ? $a / $b
: $b / $a;
$c = $a == 0 ? 0:
$b == 0 ? 0:
$a > $b ? $a / $b
: $b / $a;
# 等幅フォントのエディタにコピペしてみとくれ
0740デフォルトの名無しさん
2006/12/07(木) 19:52:10$c = ($a == 0 or $b == 0) ? 0
: ($a > $b) ? $a / $b
: $b / $a
;
なにが条件で代入するものがなにか判りやすいからだと。
ちなみに「elsif を使うんじゃねえ」とも書いてあったw
これには同意しかねるが。
0741740
2006/12/07(木) 19:53:55739氏のを採用してください orz...
0742デフォルトの名無しさん
2006/12/07(木) 20:00:54$c = ($a == 0 or $b == 0) ? 0
: ($a > $b) ? $a / $b
: $b / $a
;
ね。等幅エディタで。@Perl Best Practice
0743デフォルトの名無しさん
2006/12/07(木) 20:02:11簡単な質問でスミマセン
ある配列に
AAA
BBB
CCC
CCC
DDD
と格納されているとします。
ダブってるCCCをひとつ消して
AAA
BBB
CCC
DDD
とするにはどうすればいいのでしょうか
0744デフォルトの名無しさん
2006/12/07(木) 20:07:06@hoge = qw( AAA BBB CCC CCC DDD ) ;
%seen ;
@uniq = grep { ! $seen{$_} ++ } @hoge ;
0745デフォルトの名無しさん
2006/12/07(木) 20:11:12テンプレ>>3あたり全部読めば載ってるはず
0746デフォルトの名無しさん
2006/12/07(木) 20:14:31それいったらここんとこの質問全てが…
>>742
補足 THX
0747デフォルトの名無しさん
2006/12/07(木) 20:18:20知られています。
0748デフォルトの名無しさん
2006/12/07(木) 20:26:460749デフォルトの名無しさん
2006/12/07(木) 20:47:370750デフォルトの名無しさん
2006/12/07(木) 20:48:02答える側の住人も注意すべきかなと。
自治しなきゃ誰かが解決してくれるわけでもなし。
0751デフォルトの名無しさん
2006/12/07(木) 21:07:23質問者は同一人物だろ?
そのうち飽きるさ
0752デフォルトの名無しさん
2006/12/07(木) 21:11:15uniq するときの有名な手法の一つだよ。応用も効くので覚えておいて損はない。
下の例は拡張子を判断して各拡張子の一番若いものを grep する。
@list = qw( 00.jpg 10.png 05.png 01.jpg ) ;
%seen ;
@grepped = grep { $suf = (/\.(.*?)$/)[0] ; ! $seen{$suf} ++ } sort @list ;
print @grepped , "\n" ;
# まあ名前の長さが違えばもう一工夫必要になるけどね。
0753デフォルトの名無しさん
2006/12/07(木) 21:36:132ch見てるとたま〜にあってそれを読むとすごく気持ちいい。
0754デフォルトの名無しさん
2006/12/07(木) 21:46:540755デフォルトの名無しさん
2006/12/07(木) 22:34:392ch見てるとたま〜にあってそれを読むとすごく気持ちいい。
0756デフォルトの名無しさん
2006/12/07(木) 22:38:170757デフォルトの名無しさん
2006/12/07(木) 22:38:480758デフォルトの名無しさん
2006/12/07(木) 23:42:090759デフォルトの名無しさん
2006/12/08(金) 00:03:57やっぱりあまり綺麗だとは思わないけどなぁ
ダミアン・コンウェイは尊敬しているが
0760デフォルトの名無しさん
2006/12/08(金) 00:14:43splitを使って2次元関数を作りたいのに、うまくいきません
たとえば、
@tnk = split(/,/,"a,b,c,d");
@unk[3] = split(/,/,"a,b,c,d");
tnk[0]に"a"、[1]に"b"が入っていくように、
これでunkの[3][0]に"a"、[2][1]に"b"・・・と入れたいのに、うまくいきません
どうすれば2次元配列が作れますか?
0761760
2006/12/08(金) 00:15:54[2][1]ではなく、[3][1]です
0762デフォルトの名無しさん
2006/12/08(金) 00:32:12$unk[3] = [ split(/,/, "a,b,c,d") ];
以下、詳しい説明が必要なら。
配列変数はあくまで「スカラ値」の集まりなので、
split が返す「スカラ値のリスト」を1つの要素として代入する事はできません。
Perl での2次元配列は、配列変数のリファレンスを利用します。
リファレンスはスカラ値の一種なので、配列の要素として利用できるからです。
配列変数のリファレンスを作成するには [ LIST ] という構文が便利です。
LIST が入った匿名の(名前を持たない)配列変数へのリファレンスが作成できます。上の例なら
@unnamed_array = split(/,/, "a,b,c,d");
$unk[3] = \@unnamed_array;
とほぼ同じ意味です。
ちなみに、配列の中の1要素を添え字で参照する場合、取り出される値はスカラ値なので
@unk[3] ではなく $unk[3] のように、スカラ値を表す「$」を使う必要があります。
0763デフォルトの名無しさん
2006/12/08(金) 00:37:57インストールパッケージを開けませんでしたとでてインストールできませんでした
ActivePerl 5.6.1.638のほうはうまくいったんですが、最新版の方は
何か特別な制約があるのでしょうか
0764デフォルトの名無しさん
2006/12/08(金) 00:40:24スレ汚し申し訳ないです。。。
0765デフォルトの名無しさん
2006/12/08(金) 00:50:05TMTOWTDI だから使わなきゃいいだけじゃねw
俺にとっては三項演算子は必須になってる
0766デフォルトの名無しさん
2006/12/08(金) 00:50:26sexを使って3次元の子供を作りたいのに、うまくいきません
たとえば、
$tnk->setSpirit("どどどどうていちゃうわ");
$mnk->setJob("風俗嬢");
sex($tnk, $mnk);
$manの$man{'osiri'}に$tinkが入っていくように、
$mnkに$tnk・・・と入れたいのに、うまくいきません
どうすれば3次元の子供が作れますか?
マジレスお願いします。
0767デフォルトの名無しさん
2006/12/08(金) 02:05:300768デフォルトの名無しさん
2006/12/08(金) 02:34:30標準出力がティッシュのままなので、selectで正しく指定し直し。
sex関数も基本的には、先入れ先出し(FIFO)処理に書き換えて下さい。
0769デフォルトの名無しさん
2006/12/08(金) 03:32:170770760
2006/12/08(金) 09:19:04想定どおり動きました!
単なる知識不足だったようで、現に詳しい説明の部分が理解できません
そのあたりを勉強しなおしてきます
ありがとうございました
0771デフォルトの名無しさん
2006/12/08(金) 16:07:27#例
#
$url= http://www.youtube.com/v/2m0P-Q0joxU
#↓(リダイレクト先に変換)
$url= http://www.youtube.com/p.swf?video_id=2m0P-Q0joxU&eurl=&iurl=http%3A//sjc-static6.sjc.youtube.com/vi/2m0P-Q0joxU/2.jpg&t=OEgsToPDskKKNZHbTD7d-oE2My88f86P
0772デフォルトの名無しさん
2006/12/08(金) 16:34:19http://d.hatena.ne.jp/shag/20060920
のコードを読んでみれば分かるんじゃね?
0773デフォルトの名無しさん
2006/12/09(土) 01:24:37どうか教えてくださいm(_ _)m
Perl v5.8.8 built for i686-linux
#!/usr/local/bin/perl
$a='A¥[B¥]C';
if ( $a =~ /A¥[B¥]C/ ){
print "OK¥n";
}else{
print "NG¥n";
}
あと、任意の文字列を=~で比較しなくてはいけないとき、
"["のような都合が悪い文字列が入ってきた場合にそなえるのは
「quotemetaで処理」が適切なのでしょうか
quotemetaし忘れて=~で落ちるバグを修正しようとしたのですが、
上記のプログラムがなぜかNGになるので修正しきれないのです(; ;)
0774デフォルトの名無しさん
2006/12/09(土) 02:14:57if ($a =~ /A¥\[B¥\]C/ ){
print "OK¥n";
}
else {
print "NG¥n";
}
0775デフォルトの名無しさん
2006/12/09(土) 04:52:25(全角記号がもともとは半角であると仮定して)
正規表現では \[ は '[' という文字にマッチするので、 '\[' という二文字にはマッチしません。
'\[' にマッチするのは \\\[ です。
つまり 'A\[B\]C' にマッチする正規表現は /A\\\[B\\\]C/ です。
0776773
2006/12/09(土) 07:59:13言われて気づきましたorz (バグであせっていたのかも)
なんでもかんでもquotemetaすりゃいいってもんじゃないんですね・・・
どうもありがとうございましたm(_ _)m
0777デフォルトの名無しさん
2006/12/09(土) 08:09:37> 「quotemetaで処理」
えと、正規表現側の話だよね?まさかと思うけど変数側(ここで云う $a)じゃないよな?
この前提だと御前さんの提示したスクリプトに quotemeta の入る余地はないんだけど。
(quotemeta 使用例)
$str = 'a\[b\]c' ;
$quo = quotemeta $str ;
print $quo . "\n" ;
if ( $str =〜 /$quo/ ){ print "quote\n" ; }
if ( $str =〜 /$str/ ){ print "not quote\n" ; }
変数側の話しだとすると「すごおおおおく間抜けな事をやってる」とだけコメント
しとく。
(間抜けな例)
$quoquo = quotemeta $quo ;
if ( $quo =〜 /$quoquo/ ){ print "quotequote\n" ; }
それと 「quotemeta しわすれ」てのが理解できん。何せ提示された例の正規表現
は、直接文字列で作成されてて変数なんて見に行ってないから。
0779デフォルトの名無しさん
2006/12/09(土) 21:30:22↓のスレッドにレス付けておきました。
Perlコーディング初心者質問スレ Part 53
http://pc8.2ch.net/test/read.cgi/php/1164519503/
0780デフォルトの名無しさん
2006/12/11(月) 22:10:460781デフォルトの名無しさん
2006/12/12(火) 21:41:11windowsのシェルはsjisしか表示できないらしいので、
nkf.exeを使って、perl a.pl | nkf -sとしたんですが、
リアルタイムで実行結果が表示されず、実行しているときの状況が分りません。
a.plに$|=1;と記述してもだめです。
どうすればいいでしょうか?
0782デフォルトの名無しさん
2006/12/12(火) 22:29:490783デフォルトの名無しさん
2006/12/12(火) 22:51:420784デフォルトの名無しさん
2006/12/12(火) 23:13:35File::Path
0785デフォルトの名無しさん
2006/12/12(火) 23:15:380786781
2006/12/13(水) 00:27:54>perl -Mencoding=euc-jp,STDOUT,shift-jis a.pl
と実行すると、表示はsjisで出力されるのですが、
LWP使ってる部分↓
$ua=LWP::UserAgent->new();
$res=$ua->request($request);
$res->contentの中身が
500 Wide character in syswrite
になってしまいます。
何かいい方法教えてください。
0787デフォルトの名無しさん
2006/12/13(水) 00:59:36nkf -E -s -u
としてnkf側で解決したほうがいいんじゃないか。
ただしこの場合でもa.plのSTDOUTを$|=1にする必要はあるかも。
0788デフォルトの名無しさん
2006/12/13(水) 01:08:27やっとできました!!
まじでありがとうございました。
0789デフォルトの名無しさん
2006/12/13(水) 16:31:33たとえば
a[]=("あ","い");#a[0]="あ";a[1]="い";
↓
a[0]="あい";
にしたいのですが・・・
初心者ですみません;;
0790デフォルトの名無しさん
2006/12/13(水) 16:49:540791:789
2006/12/13(水) 17:36:19そうですか^^;
ありがとうございました
0792デフォルトの名無しさん
2006/12/13(水) 20:11:070793デフォルトの名無しさん
2006/12/13(水) 20:21:09join すればおk
@a = ("あ", "い", "う");
$a[0] = join "", @a; # => "あいう"
0794デフォルトの名無しさん
2006/12/13(水) 20:55:11たぶん見間違い。俺には Perl でも PHP でもないものに見える。
0795デフォルトの名無しさん
2006/12/13(水) 21:57:400796デフォルトの名無しさん
2006/12/13(水) 22:06:41このうち5のときは数字の5の変わりに「!」を表示させたいです。
どうすればよいのでしょうか?
多分forを使うと思うのですが、いまいちわかりません。
0797デフォルトの名無しさん
2006/12/13(水) 22:21:35入門書の購入を進めます。
0798797
2006/12/13(水) 22:29:330799デフォルトの名無しさん
2006/12/13(水) 23:10:12文字列の中で##から始まっている英数文字列があった場合
<font>タグで囲って文字を赤くしようとしていますが、この状態だと
ユーザーが任意にタグを挿入出来てしまうため置換処理を入れました。
ただ、そうしてしまうと<font>タグもむき出しになってしまい赤く表示することができません。
非常に分かりにくくてすみませんが、何かいい方法はないでしょうか?
---
$tmp = '<A> ##B <C>';
$tmp =~ s/</</g;
$tmp =~ s/>/>/g;
$Str = '##[A-Za-z0-9*.?<>\+\#-.,;]+';
$tmp =~ s/($Str)/<font color=FF0000>$1<\/font>/g;
print "$cmt";
---
↓現実
<A> <font color=FF0000>##B</font> <C>
↓理想(##赤は赤い)
<A> ##B <C>
0800デフォルトの名無しさん
2006/12/13(水) 23:13:01$cmt =~ s/>/&gt;/g;
3,4行目はこうです、失礼しました…
0801デフォルトの名無しさん
2006/12/13(水) 23:23:48他にも処理してるとかループさせてるとかじゃないのか?
0802デフォルトの名無しさん
2006/12/13(水) 23:33:350804デフォルトの名無しさん
2006/12/14(木) 00:00:07貼り付けるソースで再現性があるか確認してから貼り付けろよ。
掲示板のリソースが無駄だよ。
0805デフォルトの名無しさん
2006/12/14(木) 01:03:270806デフォルトの名無しさん
2006/12/14(木) 21:52:51@a=(あ,い,う・・・こ)
@b=(100,200,300,・・・1000)と定義づけて
それをfor文であらわすとき
for($i=1 ; $i<=10 ; $i++){
print "$i $a[10] $b[10]\n";
}
でよいのでしょうか?
表示させたいのは
1 あ100
2 い200
3 う300
4 え400
5 お500
6 か600
7 き700
8 く800
9 け900
10 こ1000
です。
0807デフォルトの名無しさん
2006/12/14(木) 22:02:32試してから質問しましょう。
良いか悪いかが分かります。
0808806
2006/12/14(木) 22:10:37@mom=(100,200,300,400,500,600,700,800,900,1000);
for($i=1 ; $i<=10 ; $i++){
print "$i $mon[0] $mom[0]\n";
}
でやってみたのですが、
1 あ 100
2 あ 100
3 あ 100
4 あ 100
5 あ 100
6 あ 100
7 あ 100
8 あ 100
9 あ 100
10 あ 100
となってしまいます。
右側二列も数字をずらすためには、どうすればよいのでしょうか?
0809デフォルトの名無しさん
2006/12/14(木) 22:16:350811デフォルトの名無しさん
2006/12/14(木) 22:25:47知らないで配列扱うとは・・・
0812デフォルトの名無しさん
2006/12/14(木) 22:51:010813デフォルトの名無しさん
2006/12/14(木) 23:06:09そんな余計なこと教えるなよ
0814デフォルトの名無しさん
2006/12/14(木) 23:30:23こんなんでわかるか?
print "$mon[0]\n";
print "$mon[1]\n";
print "$mon[2]\n";
print "$mon[9]\n";
0815デフォルトの名無しさん
2006/12/15(金) 09:39:41Devel::Sizeモジュールをインストールせず、同様のことは可能でしょうか?
自由にモジュールインストールできない環境なので、何か方法あれば教えてください
0816デフォルトの名無しさん
2006/12/15(金) 09:54:12内部APIを使わないなら無理。B::*使えば出来るかも知れんが、無謀だな。
そもそも何故メモリサイズを知ることが必要?
0817デフォルトの名無しさん
2006/12/15(金) 10:19:16簡単に言うと仕事で頼まれたからw
私もあまり意味はないと思うんですが、動作が遅いプログラムがあってその調査の一環
プログラム内部で、階層構造のリファレンスハッシュで画面出力用にデータを編集しているところが
かなりメモリを食ってるみたいで、具体的にどれくらいか調べたいと思いました
psで確認するとプログラムの使用メモリが多いけど、遅い原因はDBアクセス等の効率が悪いだけだと思ってます
Devel::Sizeを使用しないと非常に難しいと言うことはわかりました
ありがとうございます
0818デフォルトの名無しさん
2006/12/15(金) 10:22:55プログラム速度の測定なら、メモリ消費量を調べるよりDevel::DprofやDevel::Profile(標準じゃないがPurePerlだから使うのは簡単)で調べた方がいいと思うが。
0819デフォルトの名無しさん
2006/12/15(金) 10:40:46スクリプトが原因でスラッシングしているなら遅くはなるだろうけど
スラッシングしていないなら、メモリ使用量と動作が遅いはあんまり関係ないでしょ。
#少ないには越したことないけど;p
psはtelnetかsshでログインして確認したのですか?
サーバ上でシェルが使えるならコンパイラ使えればroot権限なくても
モジュールをコンパイルして使えますよ。
Devel::DprofやDevel::ProfileでプロファイルをとるかBenchmark, Time::HiResを使って
ボトルネックを探すほうがいいと重いますよ。
0820デフォルトの名無しさん
2006/12/15(金) 21:27:34かかる手間を考えると趣味専用になるが、移植性を無視すれば可能。
・リファレンスを文字列評価すればスカラーヘッダ構造体のアドレスがわかる
・unpackのPは特定アドレスからメモリの中身を読み出す事ができる
からね。
これ(PurePerlによる変数dumper)を書く事でPerlの変数に対する理解はすすむので、
話のネタとしては面白いかもしれない。
0821デフォルトの名無しさん
2006/12/16(土) 08:57:16こりゃおもしろいなあ。何か他に使い途ないかな?
0822デフォルトの名無しさん
2006/12/16(土) 09:46:46デバッグログに使用したいと思っております。
0823デフォルトの名無しさん
2006/12/16(土) 10:36:21宛先が自分のIP以外のUDPパケットを受信したいのですが、どうすれば良いのでしょうか
もしモジュールを使用する場合は標準モジュールの範囲内でお願いします
0824デフォルトの名無しさん
2006/12/16(土) 10:53:200825デフォルトの名無しさん
2006/12/16(土) 10:54:14アドレス欲しいなら数値評価のほうがよくね?
0826822
2006/12/16(土) 15:25:28__LINE__
__FILE__
__PACKAGE__
__END__
__DATA__
__FUNC__は無い認識でよろしいでしょうかorz
0827デフォルトの名無しさん
2006/12/16(土) 16:13:58なければ書いたらいいじゃない。
0828デフォルトの名無しさん
2006/12/16(土) 22:20:08Flashからcgiへ変数$nameを渡す実験をしているのですが、$nameを日本語にすると
すべて文字化けしてしまいます。手元にある入門書を参照したところ、jcode.plを使えばよいとあったので、
require 'cgi-lib.pl';
require 'jcode.pl';
&ReadParse(*name);
&jcode::convert(*name,'sjis');
print "$name";
としたのですが、まだ文字化けします。sjisにしてもeucにしても同じ結果です。
どうすればよいでしょうか。jcode.plが存在するディレクトリは確認しました。
0829デフォルトの名無しさん
2006/12/16(土) 22:37:14>>1 を読んで、WebProg板へどうぞ。
ちなみに cgi-lib.pl も jcode.pl も、もう古いです。入門書を変えましょう。
0830820
2006/12/16(土) 22:39:08何となく、数値評価だとdoubleとかintが面倒な気がして文字列から。
現行の5.8.8あたりならまだしも5.6とかになると、ちょっと迷わない?
(一応 5.6.0でも pack('I',$ref) だとdouble評価を経由しないけど)
0831デフォルトの名無しさん
2006/12/17(日) 04:18:030832デフォルトの名無しさん
2006/12/17(日) 17:21:310833デフォルトの名無しさん
2006/12/18(月) 00:49:22caller()
0834デフォルトの名無しさん
2006/12/18(月) 02:42:35これで表示を
222
とするにはどうすればいいでしょうか?
0835デフォルトの名無しさん
2006/12/18(月) 02:59:58ちゃんと基準を日本語で言ってくれないと意味違うの答えが複数ある。
文字列の一番最後なのか三番目なのか。$1に入れないといけないのか取り出せればいいのか。
とりあえずそのデータに対して動けばいいなら/(\d{3})$/とでもしとけ
0836デフォルトの名無しさん
2006/12/18(月) 03:25:33最後のものにマッチさせて、それを取り出したいってことです。
0837デフォルトの名無しさん
2006/12/18(月) 03:27:13こういう動作を一度にやりたいです。
0838デフォルトの名無しさん
2006/12/18(月) 03:50:580839デフォルトの名無しさん
2006/12/18(月) 08:19:06perl -le 'print + ( split /aaa/, "000aaa111aaa222")[0] '
perl -le 'print + ( "000aaa111aaa222" =~ /(\d{3})/ )'
perl -le 'print + ( unpack "A3", "000aaa111aaa222" ) '
perl -le 'print + ( substr "000aaa111aaa222" , 0, 3 )'
0840デフォルトの名無しさん
2006/12/18(月) 09:37:48つ perldoc -f pop
0841デフォルトの名無しさん
2006/12/18(月) 11:14:25例えば変換対象の内容をリストファイルと照らし合わせ
リストファイルの内容と一致した場合にファイルへ出力るすには
どうしたら良いでしょうか?
例えばリストファイルが
aaa
bbb
ccc
として、変換対象のファイルが
aaa test1
abc test2
bbb test3
だった場合は
aaa test1とbbb test3の抽出をしたいです。
openや関数を使ってみたけどうまくいかないので誰か教えてください。
0842デフォルトの名無しさん
2006/12/18(月) 11:34:56対象を1行ずつsplitして
0番目が連想配列に存在したら吐き出す
0843デフォルトの名無しさん
2006/12/18(月) 12:02:34>>837 訂正だ。
perl -le 'print + ( split /aaa/, "000aaa111aaa222")[-1] '
perl -le 'print + ( "000aaa111aaa222" =~ /.*(\d{3})$/ )'
perl -le 'print + ( unpack "A3" x 5, "000aaa111aaa222" )[-1] '
perl -le 'print + ( unpack "@*X3A3", "000aaa111aaa222" ) '
perl -le 'print + ( substr "000aaa111aaa222" , -3 )'
0844デフォルトの名無しさん
2006/12/18(月) 12:19:13func + (123) で func の返り値と123を加算してるのか、それとも func を 123 で呼び出してるのか
一瞬迷うのは僕だけですか><
0845デフォルトの名無しさん
2006/12/18(月) 13:51:07HTMLファイルからフォームで送られたデータを表示させるCGIです
require './cgi-lib.pl';
&ReadParse;
print <<'EOD1';
Content-type:text/html
<html>〜省略〜<table border=1>
EOD1
print "<tr><td>会社/自宅</td><td>$in{'addr'}</td></tr>\n";
〜FORMからのデータ表示繰り返し〜
print "<tr><td>メール配信</td><td>$in{'mailreq'}</td></tr>\n";
print <<'EOD2'; ←19行目。ここでエラーが出てる
</table><form action="register.cgi"><input type=submit value="登 録"></form></center></body></html>
EOD2
二回目の「print <<」を止めてprint文にすると上手くいくのですが、「print <<」が二回使えないという記述がないですし
参考書が間違ってるということにもなります。 すいませんが何が駄目なのか教えて頂けないでしょうか
0846デフォルトの名無しさん
2006/12/18(月) 13:53:41とりあえずエラー文を見せるんだ
0847デフォルトの名無しさん
2006/12/18(月) 14:01:57「絶対できる!自宅PCでCGIの実行環境を構築」というHPを参考に自分のPCでCGIを試せる様にしてます
でコマンドプロンプトで実行してみると下記のエラー文がでます。翻訳サイトで見ても意味が分りませんでした
D:\cgi>perl entry.cgi
Can't find string terminator "EOD2" anywhere before EOF at entry.cgi line 19.
0848デフォルトの名無しさん
2006/12/18(月) 14:04:310849デフォルトの名無しさん
2006/12/18(月) 14:10:27実際は全部に改行を入れています。問題の部分を正確にせずすいませんでした
print <<'EOD2';
</table>
<form action="register.cgi">
<input type=submit value="登 録">
</form>
</center>
</body>
</html>
EOD2
0850デフォルトの名無しさん
2006/12/18(月) 14:17:35あ、わかりました。識別子のことをよく理解してなかったみたいです
EOD2の後に改行を入れろ ということですね
ありがとうございます
0851デフォルトの名無しさん
2006/12/18(月) 16:51:46undef $1;としてみたんですが動きません……
0852デフォルトの名無しさん
2006/12/18(月) 16:57:080853デフォルトの名無しさん
2006/12/18(月) 17:00:25できれば質問に質問を返すのは控えてください。
0854デフォルトの名無しさん
2006/12/18(月) 17:04:090855デフォルトの名無しさん
2006/12/18(月) 17:06:05おまえには出来ない。
終了。
0856デフォルトの名無しさん
2006/12/18(月) 17:11:46どんな脳みそしてんだかさっぱりわかんねw
0857デフォルトの名無しさん
2006/12/18(月) 17:16:41人の属性について訊いているのではなく、Perlのできる・できないを訊いているのです。
もしかして、回答する知識がないのにしゃしゃり出ているのですか?
0858デフォルトの名無しさん
2006/12/18(月) 17:19:32同意ですね。
質問に質問を返す意味がさっぱりわかりません。
そして、その当然の「おかしさ」を指摘されてヒスを起こすのも更にわかりませんよね。
(回答者は理不尽に振る舞ってもいい、その理不尽を質問者は指摘せず享受せよ、
とでも勘違いしているのかもしれませんね。
でも回答者ですらないのですから、その発想は二重にナンセンスというべきでしょう)
0859デフォルトの名無しさん
2006/12/18(月) 17:24:27頭悪すぎるみたいだから説明してやる
>>856はおまえに言ってんだよ
質問する=教えを請う
質問者が理不尽なのに答える義理は無い
しね でおk?
0860デフォルトの名無しさん
2006/12/18(月) 17:31:07> >>856はおまえに言ってんだよ
でしょうねえ。
(それがわかっているから、色々と言葉を乗っけて
「それに該当するのはあっちだよ」と教えてあげているわけです)。
> 質問者が理不尽なのに
まったく理不尽ではないですね。どう理不尽だと思い込んでいるのでしょうか?
質問に質問を返してきた人間に「質問に質問を返されては困る」旨を伝えたことですか?
でも、質問に質問を返してきた人間は「回答者」ではないですから、
「質問者として回答者にどういう態度をとるべきか」というテーマで仮にあなたが
粘着したいのだとしても、>>852と>>853の関係にはまったく当てはまっていません。
なぜならこの2つのレスは、質問者と回答者の関係ではないからです。
0861デフォルトの名無しさん
2006/12/18(月) 17:38:110862デフォルトの名無しさん
2006/12/18(月) 17:40:25今回はちょっと時間があったので、どこがイタイのか丁寧に教えてあげましたが、
こんなことをする義理は無いですからねえ。
0863デフォルトの名無しさん
2006/12/18(月) 17:42:12さようなら。
0864デフォルトの名無しさん
2006/12/18(月) 17:42:46最初に答えた人も、$1を削除する以外の方法を提案するためだろうし
機能についてききたいだけならperldocで十分だし。
0865デフォルトの名無しさん
2006/12/18(月) 17:43:40質問者の態度ばかり注文つけるのはおかしいようです。次から気をつけて下さい。
0866デフォルトの名無しさん
2006/12/18(月) 17:49:44一連の「回答者でもないのに質問者に尊大な態度を取る人」がそんな感じですね。
回答するだけなら「できる・できない」で十分なのに、
その何倍もの文章を何のために書きに来たのかが「わからんなぁ」です。
答を知らない人=回答者になりようもない人、が、あたかも回答者候補であるかのように
装って「ただ尊大な態度を取りにきた」なら納得ですが。
0867デフォルトの名無しさん
2006/12/18(月) 17:53:08$<digits>
Contains the subpattern from the corresponding set of capturing
parentheses from the last pattern match, not counting patterns
matched in nested blocks that have been exited already.
(Mnemonic: like \digits.) These variables are all read-only
and dynamically scoped to the current BLOCK.
読み取り専用なので値は(パターンマッチの副作用以外では)勝手に変えられない。
当然undefで未定義値を設定することもできない。
無理にやろうとすると
Can't modify constant item in scalar assignment at ほげほげ
というエラーになるはずなので、エラーメッセージをperldiagで調べてもよい。
0868デフォルトの名無しさん
2006/12/18(月) 17:54:46どうもありがとうございます。
こんなに丁寧に教えて下さって恐縮です。
これを足場に、他にも頑張って色々調べてみますね。
0869デフォルトの名無しさん
2006/12/18(月) 17:57:160870デフォルトの名無しさん
2006/12/18(月) 17:58:16全くおかしくない
礼儀のないってない奴に答える義務はない
ここに居る人間は回答者ではなく、回答者になる可能性のある人たち
あるいは質問者になる可能性のある人たち
>できれば質問に質問を返すのは控えてください。
などという一文は回答してくれるかもしれない人に対して横柄に過ぎる
平等ではない
建前であっても立場をわきまえろ
>>867
答えるべきじゃないだろ・・・常識的に考えて・・・
0871デフォルトの名無しさん
2006/12/18(月) 18:07:02レス番の有無はあまり関係ないと思いますよ。
「誰にともなく言っているかのような」気持ちの悪い書き方を選んでいるレスには、
今回のように「ああ、あの人はそうですよね」という書き方で「本当にそれが当てはまる人」
のことに触れる――つまり「気持ち悪さが当人に跳ね返る」因果応報を狙うわけですが
(レス番を書かない人は往々にして、こちらが「対象をきっちりわかってあげる」と
「なんだ、自覚あるんだw」とか「被害妄想乙」という風に、スレをベトベトさせる方向に
頑張り出すので、スレのためにも「お前に言ってるんだよ」と言わせるよう「焙り出す」必要が
あるわけです)
もしレス番を指定してストレートに何かを言ってきたとしても、同じ内容を
「いいえ、それは○○のほうですね」というフォーマットで返すだけのことなわけですから、
認めるとか認めないとか、そういうのにはまるで関わってこないのではないでしょうか。
0872デフォルトの名無しさん
2006/12/18(月) 18:09:52できないということを知っただけではやりたかったことを
実現する助けにはならない。852の言うことに耳を貸して
こういうことがやりたいんだけどというのを説明していれば
より的確な助言が得られたかもしれないんだけどね。
0873デフォルトの名無しさん
2006/12/18(月) 18:10:360874デフォルトの名無しさん
2006/12/18(月) 18:10:49> 回答者になる可能性のある人たち
すべてが終わってから「可能性があったのだ」と言い張るのは実に便利だから
そのやり方に飛びつく気持ちはわかりますが、
「質問に質問を返す人」や、「質問に質問を返すのはいかがか」という意思表示を
自分が侮辱されたように思ってしまう「自分を質問に質問を返す人の同類に位置づけていて」
且つ「正論を言われるとムカついちゃう、ちょっと変な人」に、その可能性があるとは
思えませんね。そもそもちっとも横柄ではありませんし。
0875デフォルトの名無しさん
2006/12/18(月) 18:12:00そういう人って困りますよね。
0876デフォルトの名無しさん
2006/12/18(月) 18:19:320877デフォルトの名無しさん
2006/12/18(月) 18:24:28常識のある一社会人としてはこれ以上荒しにつきあうわけにもいかない
続きはVIPで。
0878VIPPER
2006/12/18(月) 18:31:14質問に質問で返されてブチ切れる理由が分かりません。
>>864,872のレスにもあるように、それは解決への良い手段だと思いますよ。
0879デフォルトの名無しさん
2006/12/18(月) 18:38:41自分の質問への回答だけが欲しいんなら他のはスルーしろよ。
0880デフォルトの名無しさん
2006/12/18(月) 18:40:120881デフォルトの名無しさん
2006/12/18(月) 19:00:05スレの主旨と違う議論は他でやるなりスルーしろ。
0882デフォルトの名無しさん
2006/12/18(月) 19:30:07誰もブチ切れちゃいないと思うぞ
0883デフォルトの名無しさん
2006/12/18(月) 20:12:37ってのを延々と慇懃無礼に続けてたわけね。
単純に興味があったから何でそんなことするのと聞いただけだろうに。
0884デフォルトの名無しさん
2006/12/18(月) 20:17:530885デフォルトの名無しさん
2006/12/18(月) 20:52:53質問の意味がわかれば、モアベターなアドバイスも出来るだろう?
まあ質問する側として礼儀もわきまえないような他力本願のカスに教えることなんぞない
0886デフォルトの名無しさん
2006/12/18(月) 21:08:47>>834を見て思ったのだけれど、
マッチ対象がもっと複雑なパターンだった場合は良い方法ある?
例えば
HOGE1a2bFUGA3c4d5!PIYO
こんな文字列があったときに、一番最後の
(?:[[:digit:]][[:alpha:]])+
な部分(上の文字列では3c4d)を取り出したいと言う場合とか。
.*で食わせるだけだと3cが引っかからなくなるし、後の部分を
[^[:digit:]]*$
のようにそれ以外の文字に限定することもできない気がする。
/gでマッチしてから最後を取り出すしかないかな
0887デフォルトの名無しさん
2006/12/18(月) 21:39:02こんなのはいかが?
/((?:[0-9][a-zA-Z])+)(?!.*[0-9][a-zA-Z])/
0888デフォルトの名無しさん
2006/12/18(月) 22:15:03おお、なるほど
否定先読みでそれ以降にそのパターンを含んでいなければ、とするのね。
これなら確かに大抵のパターンは/($regex)(?!.*$regex)/でできますね。
実際に書くときに使うかどうかは別問題だけれど勉強になりました。�d
0889822
2006/12/19(火) 01:25:09>>833
おお!こんなものがあったのですか!ありがとうございます
>>827
>なければ書いたらいいじゃない。
呼び元のサブルーチン名or現在のサブルーチン名を
取得する方法ってあるのでしょうか
もしありましたら教えてくださいm(_ _)m
0890デフォルトの名無しさん
2006/12/19(火) 01:42:12> 呼び元のサブルーチン名or現在のサブルーチン名を
> 取得する方法ってあるのでしょうか
(゚д゚)
だからcallerだって
sub __func__() { return +(caller(1))[3] }
0891822
2006/12/19(火) 02:26:24教えてくださいましてありがとうございました
自分乙 o...rz
0892デフォルトの名無しさん
2006/12/19(火) 02:55:51norの時は!( $boolean1 || $boolean2 )、
nandの時は!( $boolean1 && $boolean2 )と書かないといけないのでしょうか。
0893デフォルトの名無しさん
2006/12/19(火) 03:07:35修飾なしで他のファイルで使う方法はありませんか?
#コード
ファイル1 ourtest.pl
#start
use strict;
use b1;
package a;
our $x;
$x = 10;
#package b;
#print $x, "\n"; # パッケージaの$x
#同一ファイル内なら表示可能
b1::printit();
#end
ファイル2 b1.pm #実行時エラー
#start
package b1;
use strict;
sub printit {
print $x, "\n"; # パッケージaの$x
# print $main::x , "\n";なら表示可能
}
1;
#end
0894デフォルトの名無しさん
2006/12/19(火) 03:10:50メインパッケージの変数を他ファイルで使いたいのです
#コード
ファイル1 ourtest.pl
#start
use strict;
use b1;
our $x;
$x = 10;
#package b;
#print $x, "\n"; # パッケージmainの$x
#同一ファイル内なら表示可能
b1::printit();
#end
ファイル2 b1.pm #実行時エラー
#start
package b1;
use strict;
sub printit {
print $x, "\n"; #mainパッケージの$xを表示したい
# print $main::x , "\n";なら表示可能
}
1;
#end
0895デフォルトの名無しさん
2006/12/19(火) 03:27:17ド・モルガンの法則って知ってる?
!( $boolean1 || $boolean2 )は( !$boolean1 && !$boolean2 )と等価
!( $boolean1 && $boolean2 )は( !$boolean1 || !$boolean2 )と等価
まあ、「NOR演算子」や「NAND演算子」は用意されてない。
if文に関しての話ならばunlessを使うこともできる。
unless ( $boolean1 || $boolean2 )
unless ( $boolean1 && $boolean2 )
>>893-894
望む効果範囲はどこまでなの?
真のグローバル変数(=mainに細工をすると全てのパッケージから見える)にするのか
特定のモジュール(のour変数。以下同)とmainの変数を共有したいのか
特定のモジュールの特定の変数のみを共有したいのか
それだけ聞いた限りでは凄く変なことをしようとしているように見えるので、
もう一歩引いて何を目的としてそういうことをしようとしてるのか
説明したほうが良い答えが返ってくるかもしれないよ
0896893
2006/12/19(火) 03:38:55まさにこれです。
mainパッケージの変数を各種モジュールから自由に読み書きしたいのです。
>それだけ聞いた限りでは凄く変なことをしようとしているように見えるので、
>もう一歩引いて何を目的としてそういうことをしようとしてるのか
>説明したほうが良い答えが返ってくるかもしれないよ
元々一つの巨大なファイルのプログラムを分割したいと考えています。
module内からmainパッケージの変数にアクセスするときはmain::として書きたいのですが
元々のファイルが膨大な量なので、全てを変更する事は避けたいです。
0897893
2006/12/19(火) 03:43:44mainパッケージの変数を表示できるようになったのですが
簡単な方法が知りたいです。
#ファイル1
use strict;
use b1;
our $x = 10;
b1::printit();
#ファイル2
package b1;
use strict;
*x = *::x;
our $x;
sub printit {
print $x, "\n";
}
1;
0898デフォルトの名無しさん
2006/12/19(火) 06:45:37。oO(それモジュールにする意味あるのかな…) まあそれは置いておいて
とりあえず、Perlには元来グローバル変数は存在しない。
一箇所に仕掛けをしただけでグローバル変数を作るのは、
Perlはdirty hackが色々できる言語だから不可能とまでは言わないが、
かなり邪道な方法になると思う。
擬似グローバル変数を持つ専用のモジュールを作って、
必要な全てのモジュールからimportするってところでどうよ。
## GlobalVariables.pm
package GlobalVariables;
use base Exporter;
our @EXPORT = qw($x);
1;
## main.pl
use GlobalVariables;
use b1;
$x = 10;
b1::printit();
## b1.pm
package b1;
use GlobalVariables;
sub printit { print $x, "\n"; }
1;
こんなモジュールもあった。
http://search.cpan.org/~polettix/vars-global-v0.0.1/lib/vars/global.pm
0899デフォルトの名無しさん
2006/12/19(火) 10:49:590900デフォルトの名無しさん
2006/12/19(火) 11:14:400901デフォルトの名無しさん
2006/12/19(火) 11:15:09しかし、該当ページの tmp_web_sec_code に 証券コードを代入し、一件づつしか
登録できない。(どうやっていいのか良くわからない)
このページは、画面を見る限りでは、
10件づつ登録できるはずなんだけど、
どうしたらよいのかな?
全銘柄の約4000件登録するのに2時間30分かかりました。
並列処理にして、半分以下の時間に短縮できたけど、効率化できそうなので。。。
perlで使用しているモジュール
use Crypt::SSLeay;
use LWP::UserAgent;
use WWW::Mechanize;
以下の部分を効率化できる?
$class->submit_form(
form_name=> 'FORM',
fields=>{
'tmp_web_sec_code' => $stock_number,
},
button=> 'ACT_insertPfList',
);
0902デフォルトの名無しさん
2006/12/19(火) 11:31:55>>1
0903デフォルトの名無しさん
2006/12/19(火) 11:42:27それはその何とか証券側のインタフェース仕様がわからないという話なので、こっち側の
プログラムを何で書いたかにはよらない話だからスレ違い。
0905デフォルトの名無しさん
2006/12/19(火) 11:58:41学生は冬休みか。
0906デフォルトの名無しさん
2006/12/19(火) 12:43:00どうも。
演算子はないんすね。
そっちの法則の方も学校でやったような気はするんですが身についてなかったです。
ありがとうございました。
0907デフォルトの名無しさん
2006/12/19(火) 14:36:180908デフォルトの名無しさん
2006/12/19(火) 17:24:27ソフトバンクの3D携帯からのメールが来た時、
$MTBody = unmime( $$mail->parts(0)->bodyhandle->as_string )
の所で、
Can't call method "as_string" on an undefined value at 〜
なエラーが出ます。解決方法を教えてください。宜しくお願いします。
0909デフォルトの名無しさん
2006/12/19(火) 17:27:160910デフォルトの名無しさん
2006/12/19(火) 19:56:06$$mail->parts(0)->bodyhandleの返す値がundefだということだな。
なぜそうなってるかを $$mail や元のメールをよく見て調べ、適切に
修正すれば解決するだろう。
0911デフォルトの名無しさん
2006/12/19(火) 20:07:11ここで聞くより、WebProgなりケータイ関連の板で聞くべきだろう。
で、まあ、ついでに聞いておく。
送信したメールに、本文は書かれてるかい?
0912デフォルトの名無しさん
2006/12/20(水) 14:36:19例えば変換対象の内容を予め用意したリストファイルと照らし合わせ
リストファイルの内容と一致した場合にファイルへ出力るすには
どうしたら良いでしょうか?
例えばリストファイルが
aaa
bbb
ccc
として、変換対象のファイルが
aaa test1
abc test2
bbb test3
だった場合は
aaa test1とbbb test3の抽出をしたいです。
openや関数を使ってみたけどうまくいかないので誰か教えてください。
0913デフォルトの名無しさん
2006/12/20(水) 14:59:26動くか試してないけど。
open my $listfh, '<', $listfile or die $!;
my @list;
while (<$listfh>) {
chomp;
push @list, qr/$_/;
}
close $listfh or die $!;
open my $convfh, '<', $convertfile or die $!;
while (defined(my $l = <$convfh>)) {
chomp $l;
print "$l\n" if grep {$l =~ $_} @list;
}
close $convfh;
0914デフォルトの名無しさん
2006/12/20(水) 15:09:06回答されてるじゃん。
回答の意味がわからないなら、「わかりません」「できません」とか言ってからにしろよ
0915デフォルトの名無しさん
2006/12/20(水) 15:12:59月曜に全く同じ文章で書き込んだだろ?
回答したんだけどやってみた?
0916デフォルトの名無しさん
2006/12/20(水) 15:13:470917デフォルトの名無しさん
2006/12/20(水) 15:19:03やはり難しい、そーゆー質問文だよな・・・。
たぶん、リストファイル、リストファイル、ファイルと、同じ言い方で3つの「ファイル」が
文中に登場することと、
「変換」という言葉を使っていながら、その後のディテールには「変換したい」という意志が
見えるところはなく、その象徴のように「抽出」に表現が変わってること、この2点かなぁ。
1) 同じようなものが複数登場するときは、自分から「仮称」をつけて明確に呼び分けておく。
2) ある場所である単語にある概念を託したら、その概念のことは以後必ずその単語で呼ぶ。
それが曖昧な表現ならなおさら、ちょっとでも違う言い方をしたら本人以外は混乱するので。
これを守るだけで、回答者的にすいぶん答えやすくなると思うんだけどね。
0918デフォルトの名無しさん
2006/12/20(水) 15:26:11それよりも
「openや関数を使ってみたけどうまくいかない」
って文章で、質問者がどれくらい出来てるのかがわかんないよ。
単純にファイルを読み込んでリストを作るくらいは出来てるの?とか。
0919デフォルトの名無しさん
2006/12/20(水) 15:58:42$b = "2.jpg";
$c = "3.jpg";
PerlMagickでこの3枚を使ってアニメーションGIFを作り方が知りたいです
$1〜$3は同じ大きさなのでリサイズ不要です
0920デフォルトの名無しさん
2006/12/20(水) 16:00:100921デフォルトの名無しさん
2006/12/20(水) 16:14:480922デフォルトの名無しさん
2006/12/20(水) 16:18:140923デフォルトの名無しさん
2006/12/20(水) 16:23:490924デフォルトの名無しさん
2006/12/20(水) 16:33:46$image = Image::Magick->new;
$image->[0]->Read($a);
$image->[1]->Read($b);
$image->[2]->Read($c);
$image->Write("output.gif");
とかです。間違ってるようだけど
>>923
本は買う金がありません
0925デフォルトの名無しさん
2006/12/20(水) 16:37:140926デフォルトの名無しさん
2006/12/20(水) 16:39:110927デフォルトの名無しさん
2006/12/20(水) 16:44:21そのためのスレでしょう?
0928デフォルトの名無しさん
2006/12/20(水) 16:45:090929919
2006/12/20(水) 16:46:40$image->Read($a);
$image->Read($b);
$image->Read($c);
$image->Write("output.gif");
でいけました。後秒間隔を設定したいです
ちなみに>>927は自分じゃありません
0930デフォルトの名無しさん
2006/12/20(水) 16:49:03そんな言われ方したら普通は答える気が失せるんじゃないだろうか。
ここはID出ない板だから元の質問者が書いているかどうかは不明だが。
0931デフォルトの名無しさん
2006/12/20(水) 16:50:20perldoc Image::Magick でマニュアルページ見れば分かるのでは?
0932デフォルトの名無しさん
2006/12/20(水) 16:52:05ttp://imagemagick.net/script/perl-magick.php
ここでsecondで検索したら見つかるから。
0933919
2006/12/20(水) 17:03:23ありがとうございます。
$image = Image::Magick->new;
$image->Read($a,$b,$c);
$image->Set(delay=>100);
$image->Write("output.gif");
で解決しました。
>>930
自分じゃありません。
お騒がせしてすいません
早めの埋めだと思っておいてください
0934デフォルトの名無しさん
2006/12/20(水) 17:51:380935デフォルトの名無しさん
2006/12/20(水) 18:00:070936デフォルトの名無しさん
2006/12/20(水) 18:03:370937デフォルトの名無しさん
2006/12/20(水) 18:34:52open my $fh, '>', 'hoge.dat';
こういう風にファイルを開いたときに、$fhからファイル名をしることってできる?
この例ならhoge.datが帰ってきてほしい。
0938デフォルトの名無しさん
2006/12/20(水) 18:56:04引数に配列・ハッシュ・リファレンスのいずれかを受け取るサブルーチンを用意するのですが、
与えられた引数が配列とハッシュのどちらかであるか判別する方法はありませんか?
リファレンスを受け取る場合は !$#_ && ref($_[0]) で判別できるのですが、
@_%2 では引数が偶数個だった場合配列とハッシュを区別できません。
exists(${¥%{{@_}}}{keyname}) では引数の偶数番目にkeynameが含まれる配列をハッシュと誤ってしまいます。
0939デフォルトの名無しさん
2006/12/20(水) 18:58:08直接に知る方法はない。statすればデバイスとinode番号がわかるから
必死でfindすればわかる可能性はあるが、既にunlinkされててみつからな
かったり、リンクがあって複数候補がでて特定できなかったりするかも
しれない。
0940デフォルトの名無しさん
2006/12/20(水) 19:07:45こんなじゃだめなの?
$LIST = [1,2,3];
$HASH = {1 => 2, 3 => 4};
if ($LIST =~ /^ARRA/)
{print "LISTn"}
elsif ($LIST =~ /^HASH/)
{print "HASHn"}
0941デフォルトの名無しさん
2006/12/20(水) 19:15:350942デフォルトの名無しさん
2006/12/20(水) 19:27:21特にプロトタイプを指定していない関数の場合、引数はリストコンテキストで評価されます。
配列もハッシュもリストコンテキストではただのリストに変換されます。
('A', 123, 'B', 456, 'C', 789)
↑これが元は配列だったのかハッシュだったのかなんて、判断のしようがないでしょう?
0943デフォルトの名無しさん
2006/12/20(水) 19:44:340944デフォルトの名無しさん
2006/12/20(水) 19:45:11ああ、配列のリファレンスかハッシュのリファレンスかの判断かと思ったよ。
全部リファレンスに置き換えてサブルーチンに渡すか、
設計そのものを見直した方がいいんじゃない。
0945デフォルトの名無しさん
2006/12/20(水) 20:03:23ありがとうございました
0946デフォルトの名無しさん
2006/12/20(水) 20:05:08('A'
の部分が顔に見えた
0947デフォルトの名無しさん
2006/12/20(水) 20:16:55言われて見直してみたら吹きかけたじゃねーか
0948デフォルトの名無しさん
2006/12/20(水) 20:18:320949デフォルトの名無しさん
2006/12/20(水) 20:29:23・・・ってだめじゃん(呆)
♪This function should have been named wantlist() instead.
だったらさっさと作れば。。。
0951デフォルトの名無しさん
2006/12/20(水) 21:31:31なぜ正規表現。ref 使ってくれ…。
0952デフォルトの名無しさん
2006/12/20(水) 21:53:05Perl には continue なんてありませんが、next なら使えます。
0953デフォルトの名無しさん
2006/12/20(水) 22:17:02待て。ちょっと待て。
0954デフォルトの名無しさん
2006/12/20(水) 22:25:09がんばって生きろ。
0955デフォルトの名無しさん
2006/12/20(水) 22:25:47まずやってみれ。
0956デフォルトの名無しさん
2006/12/20(水) 22:33:36あんまり使わないし見ないので忘れてた(´・ω・)
0957937
2006/12/20(水) 23:41:42ありがとう。じゃああきらめて別の書き方しよう。
0958デフォルトの名無しさん
2006/12/21(木) 00:59:11開いたファイル名を何がしかの形で保存しておくだけで実現すると思うんだけれど。
取り出せないファイル名でファイルを open するというのは、少なくともぼくはやったことがないので。
それでもちゃんと CPAN には、
FileHandle::Deluxe
による文字列化機能があります。
0959937
2006/12/21(木) 01:11:38うわ、ありがとう。
インターフェース的に、ファイルハンドルだけ渡したほうが
すっきりするような状態になってたからすごく助かる。
0960デフォルトの名無しさん
2006/12/21(木) 19:21:23どうすればよいのでしょうか?
0961デフォルトの名無しさん
2006/12/21(木) 19:33:510962960
2006/12/21(木) 19:40:200963デフォルトの名無しさん
2006/12/21(木) 19:41:510964デフォルトの名無しさん
2006/12/21(木) 19:45:26ttp://www.google.com/search?num=50&hl=ja&q=Perl+sort&lr=lang_ja
ちなみに、sortにリストで渡して、結果をリストで受ければ配列要らず。
0965960
2006/12/21(木) 19:47:130966デフォルトの名無しさん
2006/12/21(木) 19:47:380967960
2006/12/21(木) 19:49:040968966
2006/12/21(木) 19:52:05ソートってのは並び替える関数だから覚えると便利だよ
リストと配列の違いも調べるといいよ
sort使わずに、っていう条件なら住人の食いつきもいいかも。
0970デフォルトの名無しさん
2006/12/21(木) 19:57:390971デフォルトの名無しさん
2006/12/21(木) 19:59:540972デフォルトの名無しさん
2006/12/21(木) 20:03:55($x, $y, $z) = sort { $b <=> $a } ($x, $y, $z);
0973デフォルトの名無しさん
2006/12/21(木) 20:12:010974デフォルトの名無しさん
2006/12/21(木) 20:25:37変数3個なら並び方は順列で6通りだから if〜elsif 文でなんとかなるだろ
0975デフォルトの名無しさん
2006/12/21(木) 20:26:12foreach (0 .. $i) {
foreach (0 .. @nums) {
@nums[ $_, $_ + 1 ] = @nums[ $_ + 1, $_ ] if $nums[$_] < $nums[ $_ + 1 ];
}
unshift @sorted, pop @nums;
}
sort() を使わないと、こんな愉快なコードを保守する破目になりますが、かまいませんか?
0976デフォルトの名無しさん
2006/12/21(木) 20:35:39if ($x < $y) { ($x, $y) = ($y, $x) }
if ($y < $z) { ($y, $z) = ($z, $y) }
if ($x < $z) { ($x, $z) = ($z, $x) }
0977デフォルトの名無しさん
2006/12/21(木) 20:39:14if ($x < $y) { ($x, $y) = ($y, $x) }
if ($x < $z) { ($x, $z) = ($z, $x) }
if ($y < $z) { ($y, $z) = ($z, $y) }
0978デフォルトの名無しさん
2006/12/21(木) 20:55:220979デフォルトの名無しさん
2006/12/21(木) 20:57:04スネーク、三大美徳の基本を思い出して!
0980960
2006/12/21(木) 21:05:54if($a<$b){
($a,$b)=($b,$a)
} elsif($a<$c){
($a,$c)=($c,$a)
} elsif($b<$c){
($b,$c)=($c,$b)
}
print $a $b $c
xyzをabcに変えました。
これでできません・・・どうしたらよいのでしょうか?
0981960
2006/12/21(木) 21:27:49別のところで質問することにします。
さようなら
0982960
2006/12/21(木) 21:29:31偽者はやめてください
0983デフォルトの名無しさん
2006/12/21(木) 21:31:29自分で$x,$,$zで質問して、なぜ$a,$b,$cに代えるの?
無知なフリして無駄に時間を使わせないで下さい
しかもつまらないし
皆さんも、親切なだけではなく、ガマン強いですね
もう相手にするのはやめては?
0984デフォルトの名無しさん
2006/12/21(木) 21:36:33上のほうで if (条件) { ブロック } を3つ並べる例を出してもらってるのに
if〜elsif〜elsif〜に動作変えちゃったのはなぜ?
つーか、sort で…というのを踏まえて $a $b を使う方向に変えたのかなあ。
0985960
2006/12/21(木) 21:44:48if ($x < $y) {
($x, $y) = ($y, $x)
} if ($x < $z) {
($x, $z) = ($z, $x)
} if ($y < $z){
($y, $z) = ($z, $y)
}
print "$x,$y,$z";
でやったらできました。
しかしifの中がいまいちわかりません。。
0986デフォルトの名無しさん
2006/12/21(木) 21:59:17そうだ、プログラマは無精であるべきだったな。
対象が増えることを予期するべきだった。私とした事が。
罰として久しぶりに次スレ建ててくる。
0987デフォルトの名無しさん
2006/12/21(木) 21:59:40本当は分かるけど。課題なんだろ。
0988デフォルトの名無しさん
2006/12/21(木) 22:29:510989デフォルトの名無しさん
2006/12/21(木) 22:31:270990988
2006/12/21(木) 22:33:590991デフォルトの名無しさん
2006/12/21(木) 22:38:00Perlについての質問箱 29箱目
http://pc8.2ch.net/test/read.cgi/tech/1166708139/
0992デフォルトの名無しさん
2006/12/21(木) 22:41:520993デフォルトの名無しさん
2006/12/21(木) 22:42:020994デフォルトの名無しさん
2006/12/21(木) 22:42:170995デフォルトの名無しさん
2006/12/21(木) 22:42:540996デフォルトの名無しさん
2006/12/21(木) 22:43:290997デフォルトの名無しさん
2006/12/21(木) 22:43:350998デフォルトの名無しさん
2006/12/21(木) 22:43:37$self->kakikomi(qq{\$s = q{$s};\n$s\n__END__\n埋め});
__END__
埋め
0999デフォルトの名無しさん
2006/12/21(木) 22:43:501000デフォルトの名無しさん
2006/12/21(木) 22:44:1010011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。