"The duct tape of the Internet"こと、
Perlについての質問箱です
"There's more than one way to do it"ということで
Perlの奥深さについて皆で語り合い、追求してまいりましょう。
CGIについての質問は板違いです。WEBプログラミング板でどうぞ。
CGIとPerlの区別がつかない人もWEBプログラミング板に行ってください。
(WEBプログラミング板
http://pc2.2ch.net/php/ )
CGIの質問は答えがPerlと全然関係ない話に帰着する場合が多かったりするので
WEBプログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
過去ログは
>>2-4 あたり
5 :
デフォルトの名無しさん :03/11/06 09:20
7 :
デフォルトの名無しさん :03/11/06 11:38
Ruby の p みたいにオブジェクト(リファレンス)の中身を手軽に表示できる関数はありませんか?
8 :
デフォルトの名無しさん :03/11/06 11:40
Perl6はこれから流行りますか?
シラネー
PerlもPerl6あたりで言語として落ち着くんだろうな。
>>7 use Data::Dumper;
print Dumper($ref);
下のコードみたいにTkとNet::Pingをいっしょに使うと perl.exeがアプリケーションエラーで落ちるんですが、 これは仕様か私の環境だけでしょうか? 環境はWin2000, ActivePerlです。 use Tk; use Net::Ping; $text = ''; $top = MainWindow->new(); $top->Label(-textvariable => \$text)->pack(); $text = 'OK' if (Net::Ping::pingecho('localhost')); MainLoop();
15 :
デフォルトの名無しさん :03/11/07 00:19
use strictやってれば-wはつけなくていいですか?
apache のログの検索ワード(UTF-8)をEUCに変換しようとしています。 Vine Linux 2.5 (perl-5.6.1 + Jcode-0.75)では成功するんですが、 Redhat9 (perl-5.8.0 + Jcode-0.83.tar.gz)では文字化けします。 こんな感じです↓ while (<IN>){ $_ =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg; Jcode::convert(\$_,euc); print $_; } perlのバージョンが違うからですか? 日本語対応が違うからでしょうか?
>>18 変換処理は Jcode がやってるんだから perl のヴァージョンは関係ない。
Vine 側では locale が EUC-JP のターミナル、Redhat 側では locale が
EUC-JP 以外のターミナルでそれぞれ表示し「化けてる」なんて馬鹿な事
を言っているのでなければ、
・Jcode.pm のヴァージョンを揃えて試す
・食わせているログが本当に同じか確かめる
・変換元が UTF-8 である事が確定しているならそれを明示
Jcode::convert(\$_, 'euc', 'utf8');
>>19 ありがとうございます。
もう一度確かめてみると、LANG=ja_JP.eucJP の環境変数を
セットしていないユーザがスクリプトを実行すると、
うまく変換できていなかったようです。
(コンソールではなくてファイルに保存したものを後で確認)
なぜでしょう?
Jcode ML を覗いてきました。 RedHat 9 の Default の locale が en_US.utf8 なので、 差し障るみたいですね。 # なぜだか分かりませんが。 なお、RH9にはEncodeがはじめから入っているので、 それを使えば吉とのこと。
つまりもうちょっとシステム周りも勉強しなさいってこった
配列の配列ってリファレンス使うしかないの? もうちっとお手軽な方法はないんでしょうか?
>>24 リファレンスによる方法のどういう点がお手軽でないかを説明してくれ。
>>24 見た目も使い勝手もC言語に近いと思うが。
どんなところが不満なの?
全然近くないだろ。
28 :
デフォルトの名無しさん :03/11/08 14:29
いやなんでもない
30 :
デフォルトの名無しさん :03/11/08 15:22
ファイルを読み込んで、値の小さいもの順にソートし、画面に出力させるプログラムを教えてください。 テキストには、n個のデータと名前があります。それを値が、小さいもの順に表示し、値の隣に名前も表示できるようにお願いします。 ********テキストファイルの中身(data.txt)********* 17.56 Itirou 12.367 Jirou 1.5697 Saburou 56.23 Shirou 0.35 Gorou ****************** *******画面に出力すると 順位 数値 氏名 1: 0.35 Gorou 2: 1.5697 Saburou 3: 12.367 Jirou 4: 17.56 Itirou 5: 56.23 Shirou ********************** と表示させたいのです。 また、順位、数値、氏名をTable文で囲って表示したいのです。 よろしくお願いします
31 :
デフォルトの名無しさん :03/11/08 15:29
my $array = [ ['a','b','c',], ['d','e','f',], ['g','h','i',], ]; print $array->[2][2]; #簡単!
>>30 print join ' ', ++$i, ':', @{$_}, "\n"
for sort { $a->[0] <=> $b->[0] } map [ /([.0-9]+)\s*(\S+)/ ], <>;
>>30 system("sort -n data.txt|cat -n");
system("sort -n data.txt|cat -n|plain2html");
34 :
デフォルトの名無しさん :03/11/08 15:52
>> 30 ほれ。 perl -ne 'BEGIN{print "順位 数値 氏名\n"} chomp;m/([\d\.]+).*?(\w+)/;$h{$2}=$1; END{foreach(sort {$h{$a} > $h{$b}} keys %h){$c++;print "$c: $h{$_} $_\n";}}' data.txt
- $a} > $ + $a} <=> $
36 :
デフォルトの名無しさん :03/11/08 17:44
>>30 初心者風に分かりやすく書くと
$i = 1;
@sortfile = sort @file;
foreach(@sortfile){
print '$i : $_\n';
$i++;
}
Windows使っている人は案外少ないのかなぁ〜 他で聞いてきます、ありがとございました。
38 :
デフォルトの名無しさん :03/11/08 17:56
>>37 perl.exeに問題がある。
有料のを金だして買いなされ。
39 :
デフォルトの名無しさん :03/11/08 22:09
>>31 my @array = (
['a','b','c',],
['d','e','f',],
['g','h','i',],
);
print $array[2][2]; #こっちの方が良くないか?
40 :
デフォルトの名無しさん :03/11/08 22:18
printとprintfの違いを教えてください。
42 :
デフォルトの名無しさん :03/11/08 22:25
>41 ありがとう。熟読してみます。
printfとsprintfはC言語の入門書の方がよほどわかりやすく書かれてる。 なんでPERLの本はどれもprintfについてちゃんと解説してくれないんだろ?
>>7 >>13 use Tk::ObjScanner;
Tk::ObjScanner::scan_object $ref;
を使てみた。これ凄くイイ!
無名配列や無名ハッシュをフォルダー、スカラ値をファイルに見立てて
ツリー表示。
scan_objectはDataDumperから呼び出すと自分でMainWindow->new
してくれる。
WeakRefパッケージがインストールされてる必要あるから気を付けて。
DataDumperの存在だけでも幸せな感じなのに、不向きと言われる複雑な
データ構造の検証に効果期待できそう。
>>43 「Effective Perl」にPerlの*printf系の詳しい説明があった気がするが。
ま、*printfの機能自体C言語からの借り物だし。
sprintfでフォーマットかけながらスカラ値にするのは便利だけどね。
>>14 私も会社で補助ツールにActivePerlでつ。がんがれ。
>>38 気になりまつ...ポインタとかないでつか?
塚
bindとlistenはネットワークプログラミングの入門書の方がよほどわかりやすく書かれてる。 なんでPERLの本はどれもbindについてちゃんと解説してくれないんだろ?
>>49 普通、サーバープログラムじゃないと使わないから
>>37 =14
「他で聞いてみます」と言われてからやるのもなんだけど。
Windows XP Professional + Active Perl 5.8.0 build 806 でも落ちるね。
とりあえず、Net::Ping::pingecho() を Mainwindow の生成前に持ってくると落ちないようだ。
>scan_objectはDataDumperから呼び出すと自分でMainWindow->new すまん、Perlデバッガの間違いですた。 気軽にデバッグができるのがPerlの魅力。最近Ruby本よんで浮気心も湧い たんだけど、このモジュールを見付けて思い直せたかも。
53 :
デフォルトの名無しさん :03/11/09 03:42
すごいくだらない質問ですみません。 今、ActivePerlをWindows XP HomeEdition使ってるのですが、たとえば print "hello\n"; とやっても hello がコマンドプロンプトで見えないくらい早くコマンドプロンプトが消えてしまいます。 C:\ perl test.pl とか入力した際にコマンドプロンプトがそのまま残って C:\ perl test.pl hello C:\ みたいにしてくれる方法は無いのでしょうか? Perl初心者で勉強を始めたばかりなのですが、出力結果が見れないので困っています。ご教授よろしくおねがいします。
すみません、いまやって見たら普通に出来ました。 違う質問なんですが、 open(F,"<test.txt") || die "cannnot open test.txt:$!\n"; while(<F>){ print; } close(F); これを実行すると、 cannnot open test.txt:No such file or directory と言われてしまいます。 同じ所にtest.txtはあるのですが何ででしょう?
>>54 open F, '<' . './test.txt' or die "cannnot open test.txt:$!\n";
これでどうだ。
>>55 レスありがとうございます!
超初歩的なミスだったみたいです。
これからも馬鹿な質問するかも知れませんがよろしくおねがいします!
57 :
デフォルトの名無しさん :03/11/09 05:03
いやです
マジレスキター まぁ、ある程度は自分で頑張って・・・
59 :
aaa ◆4nT1PmNFnA :03/11/09 21:10
aaa
で、どういう初歩的なミスだったの?
配列 @array = {a,a,b,d,c,6}; とかで、重複する文字列を消す方法はありますか?
解決しましした。 すまん。
くだらない質問なんですが、$_を一時的な変数として使うのは 使い方間違ってますか?
別に間違っちゃいない。よくやるよ。 ただ、知らないうちに破壊しちゃってた、なんてことに気をつけれ。
間違っちゃいないが注意して使えよ。 sub hoge{ $_ = $_[0]; # !! #$_をいじくる return $_; } というふうに関数内部で$_の中身を破壊するのは止めとけ。 で、local($_)とかわざわざするくらいならmy変数使え。 俺は正規表現関係で $foo =~ /.../ をいくつも書くのが面倒な時だけ"$_への明示的な代入"をしてる。
$i = @url;
for ($i2 = 0; $i2 < $i; $i2++){
$ua = new LWP::UserAgent;
$ua->agent("LWP::GETHEAD");
$request = new
HTTP::Request HEAD => $url[$i2];
$response = $ua->request($request);
print $url[$i2],"Last-Modified:\t", $response->header("Last-Modified"),"\n";
}
配列@urlにURIをぶちこんで、
更新日時を取得して表示するプログラムをつくったんですが、
表示してる途中に止まるんです、処理が重いのでしょうか?
何か解決方法は?
>>68 ドコで何秒くらい止まるのか不明。
タイムアウトを短くするとか。
レスポンスコードもチェックした方がいいかも。
リファラが必要な場合もある(普通は必要ないけど)。
質問とは無関係だけど、ループはforeach使うとよりスマートになるかな。
70 :
デフォルトの名無しさん :03/11/11 01:09
localとmyの区別が出来ない
>>67 は死んでください
別に区別できてないとは思わんけどね。 myで済むものを「わざわざ」localにするなってだけの話でしょ。
>>71 local($_); が my $_;
で済むの?
>>72 local($_); とは書いてあるが、my $_; とは書いてない。エラーになるんだし。
「my変数」ってことは my $hoge; ってことでしょ。
74 :
デフォルトの名無しさん :03/11/11 10:25
perlから外部プログラムを起動するにはどうすればいいんでしょうか。 C言語のsystem()のようなのを使いたいんですが。
perldoc -f system
ああ、なんだ、systemってそのままあったのか・・・。 どうもありがとうございました。
78 :
デフォルトの名無しさん :03/11/11 16:09
関係ないが、Perlの「=>」表記って最高に可読性があるね。 %hoge=( 'aaa' => 1, 'bbb' => 2, 'ccc' => 3, );
初心者がPerlについて質問です。 XPのパソコンにActivePerlをインストールした後 コマンドプロンプトで「perl-v」を実行したら ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー C:\>perl-v 'perl-v' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。 ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー と、でました。 これはPerlが導入できてないということでしょうか? 原因は何でしょう? アドバイスもしくは誘導をお願いいたします。
perl -v ~
解決しました。ハローワールド。
>>80 さん、ありがとうです。
自分のプログラマーとしての才能のなさにびっくりしました。
でも目の前にある新しい世界にどきどきしてます。
ここ最近スレの伸びが早いなぁ
なぁ、Windowsの話題は別スレが良いんじゃないか? ゲンナリしてるヤシの数 ↓
>>84 ActivePerlの話題はWindows板に行けとでも?
それともActivePerlスレ立てるのかい?
ところでみなさんPerlでswitch使う? 漏れは SWITCH:{ if(COND1){ //処理1 last SWITCH; } if(COND2){ //処理2 last SWITCH; } } とやってるのだが
if( COND1 ) { 処理1 } elsif( COND2 ) { 処理2 } else { 処理3 } そのまんまだなぁ。たしかif-elsif-else文は内部で最適化 かかるとかなんとかでswitch処理はあまりひねったことしてない。 だらだら長い分岐の場合はハッシュに無名サブいれてキーにヒット したら無名サブコールさせる。スコープの問題とか出そうなので ケースバイケースでやったりする。 my %subs = ( COND1 => sub{ 処理1 }, COND2 => sub{ 処理2 }, ); for(keys %subs){ $subs{$_}->() if($cond eq $_) }; ...気味悪いよな、やっぱり。
あぁッ、タブは詰まっちゃうのか。for文で回さないなら もっとシンプルになるけど、初心者にはもう読めまいな。 my %subs = ( COND1 => sub{ 処理1 }, COND2 => sub{ 処理2 }, ); $subs{$cond}->();
初心者は無理だが初級者はこれぐらい分からないとな
for でまわされる方がかえってわかりにくい。
>>89 Switch.pmはソースフィルタだからコンパイルが遅くなる上に、
結局の所if-elsif-elseに対するラッパーだから実行速度も遅いという欠点がある
ちなみにSwitch.pm(に限らず他のソースフィルタモジュール)がどういうふうにソースをいじるかは
perl -MO=Deparse script.pl
とすればある程度知ることができる
>>93 まーそうだろうね。かなりムチャしてるっぽいし>Switch.pm
Perl6からはgiven〜whenとなって実装されるらしいので
それまではif〜elsif〜elseで我慢しろと。
$msg = <STDIN>; if ($msg eq "exit") { exit(); } else { print "Syntax Error."; } exitと打ち込んだら終了それ以外ならエラーメッセージを出力。 という風にしたかったのですが、どのような文字を打ち込んでもelse{}の方が実行されてしまいます。 書き方自体が間違っているのでしょうか?
96 :
デフォルトの名無しさん :03/11/12 12:17
Perlには変数や関数の名前付けのガイドラインのようなものはありますか?
>>95 よくはまる罠
exitと入力してEnter押したら、exitの後ろに改行がついている
なるほど 1行丸ごと取ってくるので改行まで入ってしまうんですね。 "exit\n"で正しく終了してくれました。 97-98さんありがとうございます。
100>> なるほど〜 $msg =~ s/\n//g; と書くよりchompで切った方が読みやすいですね。 勉強になりました。
if ($foo) { とか open(FOO, $foo) || die "$!"; の ) の後にスペースを入れるということでは? でも print "\n" if ($foo); の ) の後には普通スペース入れないよね…
セミコロンは ・No space before the semicolon. が適用されるんで問題ないっしょ。つーか こんなもんラリーが「こうしたらいいよ」って言ってるだけなんだし 好きにすればいい。
107 :
デフォルトの名無しさん :03/11/13 08:17
初歩的な事ですが聞きたいので教えてください。 今 a.txtには a b c d e f g h といったようなデータが入っていて、これらを配列に読み込ませたいのですがどうすればいいのでしょう? 手動でやると @hairetu=("a","b","c","d","e"...........,); と言った事がやりたいのですが・・・・。
push, split を調べれ
110 :
デフォルトの名無しさん :03/11/13 10:00
↑イラネ
良く分からないのでこの部分は見なかったことにします。
なにが分からないのか分からん
113 :
デフォルトの名無しさん :03/11/13 18:21
114 :
デフォルトの名無しさん :03/11/13 19:17
@list = ("abcaabbccaaabbbcccabcccccabcccabcccc"); foreach $value (@list){ if ($list =~ /c{2,4}/){ s/c/X/; print "$value"; } } リストの特定の文字列cをXに置き換えたいんですけど・・・。 イマイチ分かりません。この初心者にどなたか慈悲を。。。
116 :
デフォルトの名無しさん :03/11/13 19:23
if ($request{'processType'} eq 'add') {# 追加の場合はエラーチェック # 存在チェック SQL の配列 my @compareSqlList; # 存在チェックする項目名の配列 my @compareItemList; if ((defined $request{項目名})&&($request{項目名} ne '')) { my $sql = "SELECT "."\n" ." *"."\n" ." FROM テーブル"."\n" ." WHERE 項目名 = '$request{'項目名'}'"."\n" ; push (@compareSqlList, $sql); push (@compareItemList, "項目名"); $error = checkValues::isCompareError_2(\@compareSqlList, \@compareItemList, $err_msg); } } 処理は走ってるんだけど $err_msgに格納してあるエラーメッセージが表示されないんだわ。何でかわかる?
>>114 演習問題を他人にやらすんじゃぁねぇーよ
118 :
デフォルトの名無しさん :03/11/13 19:33
>115 そこは有名なサイト?なので頻繁に見ています。 なんか根本から違うような気がしないでもないのですが 自分では気が付かないというか・・・。難しいです。 ヒントでも良いので取り敢えず何か教えてください。
ヤレヤレ
>>114 $list = "abcaabbccaaabbbcccabcccccabcccabcccc";
$list =~s/c/X/g;
これじゃダメ?
っていうかデータ構造はリストじゃなきゃだめなの?
>>114 foreach が何をするものか理解してる?
そこをきちんと理解すれば、foreach の次の行が間違ってるのが分かるはず。
あと s/// の使い方も間違ってる。
いじりたい文字列の入ってる変数が $_ 以外のときは、陽に変数を指定する必要あり。
>>120 を参考によ〜く調べてみるべし。
122 :
デフォルトの名無しさん :03/11/13 21:33
foreach(条件)ですよね・・・。 そこが間違ってるのは気づきましたが、 結局良く分かりません。置き換わりません・・・。
>>122 論点の整理ね
1.
@list = ("abcaabbccaaabbbcccabcccccabcccabcccc");
->@list というデータ構造はどういう意味か
2.
foreach $value (@list){
if ($list =~ /c{2,4}/){
-> $list =~/c{2,4}/ の $list という変数は何を指しているか
3.
s/c/X/;
-> s/c/X/; で置換される対象の変数は何か?
これらの意味が分からないと問題が解決しないと思われ
}
}
>>114 > リストの特定の文字列cをXに置き換えたいんですけど・・・。
> イマイチ分かりません。この初心者にどなたか慈悲を。。。
演習問題ならやってみよっと。
@list = ("abcaabbccaaabbbcccabcccccabcccabcccc"); # 配列らしいけれども 1 要素しかないよね?
foreach $value (@list){ print $value if $value =~ s/\Gc{2,4}/X/g; }
注意点は、
・最長マッチさせること
・マッチ対象を重複させないこと
なのかな?
採点キボンヌ
>>124 >>114 は X の数を c の数に対応させたいのではないだろうか?
abcabccabccc -> abcabXXabXXX のように。
>>124 grep の方が良いのかもとか思ったりした。。。
print(join '', grep s/\Gc{2,4}/X/g, @list);
いんや map かも?(優柔不断)
127 :
デフォルトの名無しさん :03/11/13 22:53
何となく出来ました(´ω`) 有り難う御座いました。
128 :
デフォルトの名無しさん :03/11/14 00:48
0x0003を0x0300 0x1234を0x3412 にするにはどうすればいいのですか?
130 :
デフォルトの名無しさん :03/11/14 02:01
131 :
デフォルトの名無しさん :03/11/14 02:36
IPアドレスを、ドット区切りからドット区切りなしの10進数に変換する式を本で読んだのですが必要ないと思って捨ててしましました。 知ってる方いらっしゃいましたら、教えて頂けませんか?
132 :
デフォルトの名無しさん :03/11/14 03:14
>>131 こゆこと?
$dec=($dec<<8)+$_ for split(/\./,"64.71.145.43");
printf "%08x = %d\n",$dec,$dec;
134 :
デフォルトの名無しさん :03/11/14 09:30
教えてください。 HTMLからBODYの部分だけをとるには、 どうすればいいのでしょう?教えてください。
135 :
デフォルトの名無しさん :03/11/14 09:44
136 :
デフォルトの名無しさん :03/11/14 14:52
>>133 ありがとうございます。えっと、ちょっと違いますです。
IPアドレスの32bitを、そのまま10進表記にした数字を
ドット区切りから求めたいのです。。。
>>136 あっちにも書いたけど
my $ip = '192.168.0.1';
my $dec = vec pack('C4', split /\./, $ip), 0, 32; # 3232235521
138 :
デフォルトの名無しさん :03/11/14 21:18
@name = ($FORM{'year'},$FORM{'month'},$FORM{'day'},$FORM{'hour'},$FORM{'minute'}); open (IN, ">> @name.txt"); print IN @data; close(IN); 2003 01 01 01 01.txtとなってしまいます。200301010101.txtにするにはどうしたら いいのでしょうか?
お返事ありがとうございます。 perlはじめてまだ2日目なので、それをどこに挿入すれば良いかわかりませんので おしえてくれませんでしょうか。 あと、 間違って $FORM{'year'},"\n",$FORM{'month'},というファイルを保存してしまったところ 削除ができなくなってしまいました。どうすれば良いでしょうか?
rm -f "2003 01 01 01 01.txt"
143 :
デフォルトの名無しさん :03/11/14 21:35
>>142 お返事ありがとうございます。
2003 ? 01.txtというファイルが保存されており
rm -f "2003 ? 01.txt" とコマンドを入力したのですが、削除できませんでした。
これはもうあきらめるしかないのでしょうか。。
144 :
デフォルトの名無しさん :03/11/14 21:41
>>140 JOINで検索した資料を参考にしたところできるようになりました。139さんもありがとうございました。
>>143 ls -Al | cat -e してみる。(コントロールコードとファイル名の終端を'$'で表示)
該当するファイルを表示されたとおりに入力して削除してみりる。
rm -rf 2003^M01.txt かな。
>>146 #!/usr/bin/perl
unlink "2003\n01.txt"
Perlで作ったファイルなら
Perlで消してはどうでしょう
unlink "2003 \n 01.txt"; かな
rm 2003*.txt とかでいいんでね?
みなさんのご協力により無事消すことができました。 ありがとうございました。
151 :
デフォルトの名無しさん :03/11/14 23:40
foreach(1..60){ if ($_ 〜〜〜 において、$_が1〜9の場合01〜09と先頭に0を付けるようにしたいのだが、 perl独自の方法で解決する事はできるのでしょうか? それとも、別個にプログラムを作成しなくてはならないのでしょうか?
(s)printf "%02d" とか
> したいのだが、 > のでしょうか?
154 :
デフォルトの名無しさん :03/11/15 00:40
PERLで特定のフォルダ内のファイルをリスト化しHTMLで出力する場合、 どのようにリストを取得すれば良いのでしょうか?
155 :
デフォルトの名無しさん :03/11/15 00:48
156 :
デフォルトの名無しさん :03/11/15 00:55
>>155 THX
ここに居る人たちは本当に詳しいなぁ。なんでこんなに詳しいんだ??
>>157 ワロタ。全くもって同意。
そもそも readdir もあんまり perl の話じゃないしな。
159 :
デフォルトの名無しさん :03/11/15 02:02
>>137 ありがとうございます。ところが数値が-1062731775になってしまします。
(print "$dec";しただけです。)
多分signedとして出力してるのではないかと思うのですが、unsignedにするにはどうすればいいでしょうか?
160 :
デフォルトの名無しさん :03/11/15 02:08
>>159 それどっかのHPに書いてあったよ。忘れたけど。
ところで、Webプロキシのperlどっかにおっこってないでしょうか。
161 :
デフォルトの名無しさん :03/11/15 04:14
教えてください。 @hairetu には (a,b,c,c,t,a,t,b,・・・・・・・) とたくさんデータが入っていて、 aは全部で何個 bは全部で何個と言う風に計算したいんですけど、さっぱり分かりません。 どなたか教えていただけ無いでしょうか?
>>161 $a = grep {$_ eq a} @hairetu;
$b = grep {$_ eq b} @hairetu;
:
>>159 $dec = sprintf "%u",$dec;
でどでそ?
>>161 a-z の数を調べるのだろうか・・・
$alphabet{$_}++ foreach @hairetsu;
で %alphabet に数値が入りそうな。。。
そうなんです、全く才能無いんですけどやらないといけなくて・・・・
>>163 >>164 a-zの数を調べるのじゃなくて、配列には (次郎、太郎、三郎、次郎、・・・・
の様に何が入っているかは事前に分からないんです。
>>166 才能がないならブー垂れないで、もがけよ。
他人が手助けしてくれているのに
条件を後出しするって何様の積もり?
169 :
デフォルトの名無しさん :03/11/15 15:27
#
>>166 use strict;
my @hairetu = qw(a b b c a b);
my %count_hash;
map {$count_hash{$_}++} @hairetu;
while(my ($key, $value) = each %count_hash)
{ print "$key: $value\n"; }
170 :
デフォルトの名無しさん :03/11/15 15:33
なんか、mapのボイド・コンテキストでの使用はトリッキーでどうも好かんね。
171 :
デフォルトの名無しさん :03/11/15 15:42
>>170 map {$count_hash{$_}++} @hairetu;
より
for (@hairetu) {$count_hash{$_}++}
のほうがお好きですか。
172 :
デフォルトの名無しさん :03/11/15 15:46
うん。それか164の後半の書き方が好きだね。 mapは基本的にはリストからリストの写像って感じでつかうね。
sub timeOut { my ($r_time, $compare_time) = @_; if ($compare_time ne "") { return (time - $r_time > $compare_time); } else { return (time - $$r_time{'time'} > $$r_time{'timeout'}); } } このサブルーチンは何をしているのでしょうか?
>>173 > sub timeOut {
小学生にも笑われるぞ
>>173 undef か 1 を返しています。
でいいのかな?(w
変数の扱いを見ると本体は、かーなーりー混乱しそうなソースのようですけれども(哀)
>>176 自分が作ってないやつは全部聞くのか?
そもそも、こんな短かいのが読めないやつが「自分で作」れるとは到底思えんのだが。
>>174 笑うところどこ?
# Javaみたいなスタイルだから?
>>178 timeOutと{の間のスペースでしょう。
timeOut って書いてあるからタイムアウト処理なんだろ
183 :
デフォルトの名無しさん :03/11/16 05:04
>>137 >>164 レスが遅くなって失礼しました。希望通りの結果を得られました。ありがとうございました。
184 :
デフォルトの名無しさん :03/11/16 05:05
>>169 ありがとうございましたm(__)m
これで出来ました。本当に助かりました。
187 :
デフォルトの名無しさん :03/11/16 14:42
exit; を入れるとエラーが出てしまいます。 考えられる原因は何でしょうか?
>>187 「Perl が動きません。考えられる原因は何でしょうか?」
の問に完璧に答えられたら教えてあげるYO!
Tkを使ってる会社ある?普通はJavaかな?
予想 CGIとして動かしていて、エラーというのはPerlが出すエラーではなく、HTTPサーバが出すエラーである。 ヘッダーを出力せずにexitしたからエラーとなった。
正規表現で (/A.*?B/) と書くとAとBの間に改行文字があった場合マッチしない ようなのですが改行文字があってもマッチするようにするにはどう書いたらいいんでしょう?
ところでObjective Perl 実践してる人います? 漏れはどうもあの泥臭い文法が好きになれないんだが
@data = (["January", 28], ["February", 15], ["March", 18], ["April", 20]); という2次元配列があったとして、各配列の2番目の要素(28や15)で ソートして2次元配列を生成するにはどうしたらよいのでしょう?
198 :
デフォルトの名無しさん :03/11/18 02:20
sort {$a->[1]<=>$b->[1]} @data; じゃダメかしら?
>>197 どうしたらよいか自分で考えたのかおまいは
>>197 >>198 Perl の sort は安定なソートをしてくれると思うけど、神経質な人は
> sort{ ($a->[1] <=> $b->[1]) or &CmpMonth($a->[0], $b->[0]) } @data;
ってやって、
> sub CmpMonth($$) {
> my( $MonA, $MonB ) = @_;
> %Mon = (
> 'January' => 1,
> 'February' => 2,
> ...
> 'December' => 12
> );
> $NumA = $Mon{$MonA};
> $NumB = $Mon{$MonB};
> return ($NumA <=> $NumB);
> }
ってしておくといいかも。
Bug があると恥ずかしいのでsageで。
>>200 それなら
sort day_month @data;
sub day_month { #以下略
}
の方がスッキリすると思うが
202 :
デフォルトの名無しさん :03/11/19 00:46
>>199 コード示せないのに偉そうなこと言ってんじゃね〜よ
ボンクラ君!
203 :
デフォルトの名無しさん :03/11/19 00:47
>>202 煽るよりもまずすべきことがあるでしょう。
204 :
デフォルトの名無しさん :03/11/19 01:01
205 :
デフォルトの名無しさん :03/11/19 03:57
$tmp="こんにちは。今日はいい天気ですね。"; $tmp=~/(.*)。/; print $1; 教えてください。上のは自分で"。"で区切るようにしたつもりで こんにちは と表示したかったのですが、全文出てきてしまいます。 どうすれば。で分ける事が出来るのでしょう?
>>205 この場合最短マッチすれば桶
単に区切るなら、split が吉鴨
207 :
デフォルトの名無しさん :03/11/19 05:09
>206 split使った方がよさそうですね。 ありがとうございました。
208 :
デフォルトの名無しさん :03/11/20 00:04
他のスレで聞いてもまともな答えが返ってこなかったのでここで聞きます。 シリアルポートを下記でオープンして open(COM1, "+>COM1") or die "Can't open COM1: $!"; read($Port,$response,1); ってやると永久に待っているのですが、10secで タイムアウトなんて出来ないんですか?
perldoc select
210 :
デフォルトの名無しさん :03/11/20 00:21
>>209 あっちでもそんなこと言っていた奴がいたが、それじゃわかんねーっつーの!!
211 :
デフォルトの名無しさん :03/11/20 01:02
212 :
デフォルトの名無しさん :03/11/20 01:23
どう考えても、perlを使用するメリットが感じられない。 デバッグ大変やろ? 小手先のテクニックではなく、トータルの開発効率で考えろよ。と perl馬鹿どもに言いたい。
213 :
デフォルトの名無しさん :03/11/20 01:29
ほとんど、モジュール使うようにしているからそうでもない。
>>212 自分で書いてるんだったら、記述が悪い。
持ってきたんだったら、ソースが屑なだけ。
結局、自分はいいソースをみたことがないということで勉強不足やといいたいわけな。
>>210 これで分からないならプログラミングなんてやめたほうがいいな
>>212 日本語が良く分からんのだが、
> 小手先のテクニックではなく、トータルの開発効率で考えろよ
perl を使ってるやつは小手先のテクニックを考えてるから perl を使ってるのか?
217 :
デフォルトの名無しさん :03/11/20 08:31
質問です。十進数を二進数に変換する関数を作っています。 しかし、現在のコードでは255より大きい引数を取れません。 引数に、任意の整数を取れるように改良する方法を教えてください。 コードは以下の通りです。 sub tenToTwo { unpack("B8", pack("C", $source)); } print tenToTwo(4); お願いします。
>>217 10進数->8進数->2進数でやれ
10進数->8進数: sprintf
8進数の各桁->2進数の下3桁
220 :
デフォルトの名無しさん :03/11/20 18:14
ある値がいくつ含まれているか数えたいのですが、効率のいい方法(負荷の軽い方法)はあるでしょうか? 具体的にはこんな感じです。すごく無駄っぽいので、なにかいい方法を探してます。 $n =($value =~ s/\r/\r/);
>>220 $n =($value =~ m/\r/g);
222 :
デフォルトの名無しさん :03/11/20 18:45
tr
文字数カウントするだけなら tr/// 使うでしょ。普通
MacOSXでperlを使う際に、日本語を処理させるにはどのようにすれば良いでしょうか?
227 :
デフォルトの名無しさん :03/11/21 13:30
グローバル変数を使わずに、クロージャで関数に値を閉じ込めながら 処理していく、そういったやり方のサンプルコードはありませんか?
229 :
デフォルトの名無しさん :03/11/21 18:25
んー、やっぱりカウンターもどきの物ばっかりですな。 クラスにおけるデザインパターンのようなプログラムデザインに 影響を及ぼすような何かは、LISP使いにならないと学べないのかな。 「関数を返す関数」の鮮やかな使い方が見たい。。。
7箱目に今日気付いた。2週間越しか。。
誰も答えてない奴を一つ。
>>151 foreach("01".."60"){
マジカルインクリメントでもいい。
>>229 黒豹本ではクロージャの活用例として、
GUI のコールバックプロシージャと、
乱数・偶数ストリームの生成器が挙げられている。
ま、目的無しに手段は学べんってこった。
233 :
デフォルトの名無しさん :03/11/21 21:03
>>220 です。
>>221-223 ありがとうございます。
自分的にはm//の方がいいかと思うのですが、やっぱりtr///の方がいいでしょうか?
また、蛇足ですが、今までtrはほとんど使ってこなかったのですが、s///とtr///の違いは何でしょうか?
あまり違いが分からないのですが、後学のために教えて下さいませ。
>>233 教えてクレクレ君?
自分でその違いを見つけてみるのも楽しいと思うけれども。。。
235 :
デフォルトの名無しさん :03/11/21 21:38
教えてクレクレ君ですいません。 あんまりperlに楽しみを求めていませんので・・・道具として使っているというか・・・ perlを愛している人には申し訳ないのですが・・・
236 :
デフォルトの名無しさん :03/11/21 21:40
ロジックは愛してるかもしれません。 それを考えるのは好きなのでこの仕事をしてるのかもしれません。 ただ、目的のためにはCでもPerlでもいいわけでして・・・ メンテナンスがいいことと、文字列処理がしやすいのでperlを使ってます。 駄文すいませんでした。
238 :
デフォルトの名無しさん :03/11/21 23:37
ただ単なる道具としてPerlを使ってようが教えてクレクレじゃどうせ道具としても使いこなせんだろー
道具として使っているのなら尚更・・・という職人気質みたいなこというと嫌われますよねこの昨今(哀)
242 :
デフォルトの名無しさん :03/11/22 09:22
>>240 ん?何を勘違いしてるんだろう?
ここでもそうだけど、メーリングリストとかの自称Perl使いは、構文に凝りすぎだと思います。
>>241 知る必要があることと無いことがあると思うんですよ。道具に関して。
例えば、車を使うのにエンジンの組み立て方を知る必要があるでしょうか?
コンピュータ制御されたエンジンのアルゴリズムを知らないと、車を運転する資格がないのでしょうか?
ある程度の線引きがあると思うんですよ。ここまで知ってれば十分っていう。
掲示板で教えてくれる親切な人は、その線引きがおかしい人がいるんじゃないかと。。。
243 :
デフォルトの名無しさん :03/11/22 11:26
>>242 道具として使うなら、せめて「ProgrammingPerl」くらいは持ってるべき。
あるいは、マニュアル(perldoc)くらい嫁と子一時間(以下略
perldoc -f s -> perldoc perlop と進めば、最低でもs///とtr///くらいの
基礎的知識は容易に得られる。
前者は正規表現置換演算子。後者は一括文字置換演算子。
trは正規表現より遥かに高速で、tr/AB/BA/という芸当が出来るのが特徴。
sは常勝不敗で最強無敵。理論上は何でもできるが、何でもやらせられるほど
高速ではない。書き方によって大きく差が出るPerlの中に潜む別言語。
>>242 構文に凝ろうが凝るまいが本人の自由だろ。
コーディングに凝るのはPerl使いだけに限らないし。
道具に関して知る必要があることとないことの線引きなんてないね。
それも本人の自由だから。
ここまで知ってれば十分なんて思ってるような香具師はプログラミングに
限らず何やっても大成しないよ。
245 :
デフォルトの名無しさん :03/11/22 11:35
>>242 Perlの構文ならその車の使い方に相当するんじゃないの?
エンジンの組み立て方はPerl(のインタプリタ)の作りに相当するものだよね?
>>242 基本的には同意。
とはいえ、Perl モジュールの内部構造とか、Perl での OO の実現方法とかなら、その
車の例えに合致してると思うけど、s///, tr/// レベルは Perl 組み込みの演算子で、
しかも利点として挙げられてる文字列処理なわけで。
人に聞くよりも自分で調べたり試してみたほうが身につくとは思うんだけどな。
で、端的にいうと、tr は文字ごとの置き換え、s は文字列の置き換えで正規表現が利用可能。
と、「人に聞く」形にして嫌がらせしてみるテスト(w
>>239 あ、「誰も答えてない奴」ってのは「誰も答えてない質問」ではなく「誰も答えてない回答」って意味です。すまん。
>>242 その凝りすぎの表現がperlだと普通かもしれない罠。
要するにアレだ、AT車乗りはトランスミッションなんて知らなくても運転できるじゃんと言うが PerlはMT車なのよ
つか何に例えようが 所詮Perlではtr、sは自分で調べろよって次元の話なんで
こんなことウダウダ言ってる間にドキュメントに一通り目を通せるだろ。
馬鹿の逆切れみっともないでFA
253 :
デフォルトの名無しさん :03/11/22 23:11
Perl:Mach Go Go Go
255 :
デフォルトの名無しさん :03/11/23 14:09
>>253 私もそう思います。Cはメモリ特に関連で仕様をきちんと理解していないとクリティカルなエラーを起こしますが
その辺は適当に済ませられるPerlは優れているというか便利だと思います。
Cはあまり日曜大工に向きませんが、Perlは日曜大工向きだと思います。
慇懃無礼
257 :
デフォルトの名無しさん :03/11/23 22:17
すみません。そういう意味ではなかったんですが。
258 :
デフォルトの名無しさん :03/11/24 04:40
259 :
デフォルトの名無しさん :03/11/24 06:28
perl/tkでのX環境での日本語入力について情報どこかにありますでしょうか? 例えば、kinput2の場合、リソースに perl*inputMethod: kinput2 とかしておくだけではダメなんですね。
260 :
デフォルトの名無しさん :03/11/24 07:00
system()でシステムコマンドを実行する際にユーザを変更して実行(或いはユーザを指定して実行)したいのですが、 perlでこのような事は可能でしょうか? --- OS FreeBSD4.9RE Perl ver5
>>261 system('su username -c "whoami"');
あたりまえだが要root。
setenv LC_ALL ja_JP.EUC setenv LANG ja_JP.EUC setenv XMODIFIERS '@im=kinput2' と環境変数を設定しておけば、 #!/usr/bin/perl use Tk; MainWindow->new()->Text()->pack(); MainLoop(); で、テキストウィジェットが開いて日本語入力&編集できるようになりました。 perl/tkは日本語も使えて便利でいいですね。
>>262 さん
教えて頂いた方法で上手くいきました。
ありがとうございました。m(_ _)m
265 :
デフォルトの名無しさん :03/11/24 19:49
$old_fh=select(STDOUT); $| = 1; select($old_fh); これが何をしているのかまったく分かりません。 2年ほど悩んでいるのですが教えてください。
267 :
デフォルトの名無しさん :03/11/24 21:26
>>265 まず現在のファイルハンドルを退避し標準出力をデフォルトに設定している。
次にデフォルトのファイルハンドルに関連する特殊変数$|に代入することで、標準出力を自動的にフラッシュするように設定している。
最後に退避したファイルハンドルを再設定している。
これがあなたのお役に立てば良いのですが ;-)
select( (select(STDOUT), $|=1 )[0]) Lispの甘く危険な香りが・・・(;´Д`)
use IO; しとけば autoflush STDIO 1;
if($foo == 1+2+4) は勝手に if($foo == 7) と解釈してくれるみたいですが、 if($bar eq uc('foobar')) は if($bar eq 'FOOBAR') と解釈してくれるのでしょうか?
>>273 #--- test.p ---
use strict;
my $foo = 7;
my $bar = 'BAR';
if ($foo == 1 + 2 + 4) { print 'foo!' }
if ($bar eq uc 'bar') { print 'bar!' }
__END__
> perl -MO=Deparse test.p
use strict 'refs';
my $foo = 7;
my $bar = 'BAR';
if ($foo == 7) {
print 'foo!';
}
if ($bar eq 'BAR') {
print 'bar!';
}
test.p syntax OK
らくだ本でなくても普通のムック本にのってるだろ、それ
>>269
>>274 B::Deparse は構文解析をしているだけのようにしか見えないですが、
それは perl がコンパイルした物と同じになるのでしょうか?
280 :
デフォルトの名無しさん :03/11/26 16:35
5.8.2とjperl5.005とで同じスクリプトを使えるようにしたくて、 if ($] > 5.008) { use encoding "sjis"; use open ":encoding(sjis)"; binmode STDERR, ":encoding(sjis)"; } とやってもうまくいきません。 ifブロック内にuseが入れられないとするなら、 同じようなことをやる方法ってないのでしょうか? (あ、ShiftJIS使うなってのはナシで)
281 :
デフォルトの名無しさん :03/11/26 17:06
282 :
デフォルトの名無しさん :03/11/26 17:27
>>281 まぁ超力ずく解決でイイなら、5.8.2とjperl5.005じゃ@INCが
違うだろうから、jperl5.005の@INCの先頭のディレクトリに
nopなダミーencoding.pmとopen.pmを書いて入れとく、
とか考えたけど、binmode STDERR, ":encoding(sjis)";
は解決不能っぽいですな。w
>>280 > use encoding "sjis";
は、BEGIN { require encoding; import encoding "sjis";}と等価。
BEGINで分かるようにuseは必ずコンパイル時に評価される。
実行時にuseと同じことしたいならrequire+importにする。
if ($] > 5.008) {
require encoding; import encoding "sjis";
require open; import open ":encoding(sjis)";
binmode STDERR, ":encoding(sjis)";
}
ってのは、どうよ。実際にうまく動くかどうかは分からないが
試してみそ。
>>283 実行時にプラグマを読んでも無駄
BEGIN{
if ($] > 5.008) {
require encoding; import encoding "sjis";
require open; import open ":encoding(sjis)";
binmode STDERR, ":encoding(sjis)";
}
}
285 :
デフォルトの名無しさん :03/11/27 07:47
ん〜 $strs = "0123456789acdefghijkl"; とある これのx番目の文字だけを書き換えたい で、 print strchg($str,5,"st"); とやれば 0123st6789acdefghijkl としたい 便利な関数とか無い?
メンゴ substr
Perlって不便ね
289 :
デフォルトの名無しさん :03/11/27 12:41
漏れもC厨だけど、今日からPerl勉強し始めてるんでageちゃう。
291 :
デフォルトの名無しさん :03/11/27 16:52
>>290 ありがと♪
substrにそんな使い方があるとは知らなかった
てっきりExcelのmidと同じだと・・・
print substr($msg,2,4);
substrはperl4の昔から左辺値になるんだけど.......... 知らない香具師大杉
言われりゃ思い出すんだが、コード書いてるときはすっかり忘れてる < 左辺値 .. のフリップフロップとかも 精進が足りないのぅ
適当なファイルで、保存後コマンドラインから実行して3分後から倍速モードになる #!/usr/bin/perl $tick = time(); sleep(180); while (1) { @date = localtime($tick); $fmt = sprintf("%02d%02d%02d%02d.%02d", @date[4] + 1, @date[3], @date[2], @date[1], @date[0]); `date $fmt`; print "$fmt\n"; $tick += 2; sleep(1); } OSの時計が倍になるらしいんですが意味わかりまつぇん 教えてくだちぃ
$tick += 2; sleep(1); 1秒ごとに時計を2秒進めてるから倍速になったように見えるだけでしょ。
perl/tkで、文字列入力ウインドウを作って、 ユーザが文字列入力できてEnter/Returnが押されたら 入力中の文字列をperlの変数に入れて特定の関数を呼ぶ、 っていうのはどうすればできるでしょうか?
>>297 素早い反応どうもありがとうございます。
$object->bind( "<Return>", [CallBack] );
と、単にバインドすればよいわけですね。
pure perl な SAX2 パーサってありまつか?
300 :
デフォルトの名無しさん :03/11/28 13:36
Perl/TkよりもカッコイイGUI開発環境ってPerl.NETかなー とか思って色々調べてるんだけど、日本語情報皆無でつね・・・
301 :
デフォルトの名無しさん :03/11/28 14:35
>>300 おめでとう!
君がPerl.NET関連情報翻訳の第一人者だ!
302 :
デフォルトの名無しさん :03/11/28 14:36
>>300 おめでとう!
君がPerl.NET関連情報翻訳の第一人者だ!
303 :
デフォルトの名無しさん :03/11/28 15:04
Perlコミュニティは初心者に対して病的に親切だと聞きました。 もしかしてマジですか?
さあ。俺に言えるのは、言語が病的なことだけです。
305 :
デフォルトの名無しさん :03/11/28 16:25
すみませんどなたか教えて下さい。 Perl から system関数を使用して 外部(自作)のコマンドを呼び出して 戻り値を取得したいのですが、戻り値の値の範囲は 0〜255 までなのでしょうか? 詳しい方教えて下さい。 環境:WindowsXP ActivePerl v5.8.1 呼び出し元 sysetm( "foo.exe" ); printf "ReturnCode->[%d]\n", $? >> 8; 呼び出し先 foo.c int main( void ) { return 1077; <-- この値を呼び出した Perl プログラムで取得したいのです。 } よろしくおねがいします。
306 :
デフォルトの名無しさん :03/11/28 17:03
戻り値を標準出力に出力させて Perl側がsystemの代わりに逆クォートを使い 外部プログラムの標準出力を文字列として受け取るのではダメなのか?
307 :
デフォルトの名無しさん :03/11/28 17:18
返信ありがとうございます。 それで解決できそうです。 とりあえず、戻り値として返そうとすると、値は 255 までしか 返せないんでしょうか? よろしくお願いします。
309 :
デフォルトの名無しさん :03/11/28 18:04
環境はWindowsXPです。 return 1077; はPerl側では取得できない様ですね。。。 >306 で教えて頂いた方法で解決しようt思います。 ありがとうございました。
310 :
デフォルトの名無しさん :03/11/28 19:05
下記のような外部ファイルがあり、ある文字の含まれる行をカウントしたいのですが、 「ある文字」というのが スクリプトであらかじめ設定できないないので困っています。 -----外部ファイルの例---------------------------------------- (適当な文字列、. も含まれる).(★ここを数えたい★) (後ろは任意の文字列) power.hogehoge-man Yah! 2cher.mona- (・∀・)アヒャ fusianasan.hogehoge-man 2Getttttttttttttttttttttt tarako.umaibou.mentai I love 2ch which is NHK ------------------------------------------------------------ このとき、hogehoge-manの数とmona-の数、mentaiの数を数えたいのですが、 数える対象を指定する方法がわからんです。 たんに m/$word/とすると、何度もhogehoge-manを数えてしまって効率が悪いです。 どうか 教えてくだされ。
>>310 数えたいのは
/^(\S+)\.(\S+) .+$/
の $2 の部分ってことでいいわけ?
じゃ、ここを切り出して、
$testpattern = $2;
$testpattern =~ m/$word/
でどうよ?
あなたの質問を誤解していたらごめんなさいね。
クククのクーソ
>>311 もう少し親切に
@patterns = ('hogehoge-man', 'mona-', 'mentai');
$cnt = 0;
while(<>) {
/^(\S+)\.(\S+) .+$/;
$testpattern = $2;
foreach $pat (@patterns) {
$cnt += ($testpattern =~ m/$pat/);
}
}
クククのクーソ。。。
>>310 ハッシュを使えば良いんじゃないかな。マッチした文字列をキーにして
$count{$1}++
という具合に。
314 :
デフォルトの名無しさん :03/11/28 23:53
ActivePerl 5.6.1 環境で、外部プログラムを実行し その外部プログラムの実行時間を親側で監視することって できるんでしょうか、Unix環境のalarmのような ActivePerlではalarmは実装されてないので
>>314 UNIXのalarmってそんなものだったっけ?
指定時間後に自プロセスにSIGALRMを送るように設定するものだったと思うけど。
「パソコン」というShiftJISの文字列をjcode.plでEUCに変換すると 「パャRン」のように文字化けします。 これは「ソ」という文字の2バイト目にエスケープと同じ文字コードが 存在するためです。 そこで「ソ」が含まれる文字は「ソ\」に置き換えしたいのですが どうもうまく動きません。 $str =~ s/ソ/ソ\/; これじゃダメなんでしょうか('A`)
317 :
デフォルトの名無しさん :03/11/29 00:13
>>315 言葉足らずですみません
外部プログラムがある一定時間動きっぱなしのときに
KILLシグナル送って強制的に終了させたいと思ってるんです
>>316 jcode.pm とか encode モジュールとかは?
クククのクーソ。。。
>>317 Perl5.8.0ならUNIXと同じalarmが実装されているみたいだよ。
↓のプログラムを実行したら、5秒後にcaughtと表示して終了すればいいんだよね? sub alrmhandler { print "caught\n"; exit(0); } $SIG{ALRM}='alrmhandler'; alarm(5); while(1){;}
>>316 $str =~ s/ソ/ソ\\/;
っていうかencode使え
323 :
デフォルトの名無しさん :03/11/29 01:10
>>320 そうそう、このとおりでつ
実際にはforkのあと子プロセスをexecして、そのプログラムが
一定時間帰ってこなかったときに kill('KILL', $pid);
で子プロセス強制終了したかったんです
Windows環境ではあきらめてたんだけど、バージョンうpで
alarm実装されてたのか、とにかくありがとうございます
>>321 変数に格納された時点で¥の解釈が行われてました('A`)
文字列置換プログラムでIDを入力したらそいつのメールアドレスが表示されるみたいなプログラムって
できるんですか?例えば tamaru と入力したら
[email protected] みたいな
$input = tamaru; $output = $input . '@domo.ne.jp'; クククのク〜ソ。。。
>>325 IDをキー、"キー + @xxx.ne.jp " をバリューにするような
ハッシュを作っておけば
print $hash{'tamaru'}; とかすればいいんじゃない
>>315 >>317 alarmとかで、ミリセカンド単位で何ms後(例:100ms)になにかしたい場合は、
use Tk;
MainWindow->new()->after(100, \&callback_func);
MainLoop();
sub callback_func { print "hoge\n"; }
これだけで大丈夫ですよ。
afterの代わりにrepeatとすれば定期的に呼び出してくれます。
329 :
デフォルトの名無しさん :03/11/30 01:58
そんなものをperlで書く意図がわからない C/C++つかえや、(,,゚Д゚)ゴルァ
>>328 おお、これもいいですね
結局は alarm() で子プロセス kill は ActivePerl5.8/WinXP
ではうまくいかなかった(cygwinではOK)んで
Win32::Process を使って実現しますた
>>329 Windowからのイベント待ちしながら、文字列処理しながらできるのが、
Perl/Tkのいいところじゃないですかー。C/C++は比較対象にすらならない。
332 :
デフォルトの名無しさん :03/11/30 07:54
>>332 何がうまくいかんのかさっぱりわからん。
そのページに思いっきり答えが載っているというのに。
> # 文書 $text から http URL を抽出して @http に格納する
> @http = $text =~ /s?https?:\/\/[-_.!~*'()a-zA-Z0-9;\/?:\@&=+\$,%#]+/g;
335 :
デフォルトの名無しさん :03/11/30 11:06
巨大な文字列を引数や戻り値として関数間でやりとりするときは リファレンスにすると効果ありますか?っていうかC,C++屋なので、 Perl使いがリファレンスを全然使わないのが不思議でならないのですが。
8年ぐらい前の記憶では、確かに効果はありました。 計測してみれば…。
338 :
デフォルトの名無しさん :03/11/30 11:19
Perlの言語的/実装的に見て、リファレンスを使ったところでそれ程の効果が ないのか、それともPerlerが単にドキュソなのかハッキリして欲しいね。 引数に関しては、あれは暗黙のリファレンス、それもconstの、ってことでいいよね? だけど、みんなmy変数にいったん「コピー」してから使ってる。ハァ?って 感じでしょ。値の参照だけなら$_[0]でいいじゃん。戻り値の扱いについては まだちょっと分らず。
340 :
デフォルトの名無しさん :03/11/30 11:30
>>339 ハァ?リファレンスとは参照のことではないのですか?
&func(\@values);
...
sub func{
foreach (@{$_[0]}) {
こんなに簡単に出来ることをどうしてやらないのか。
>>335 ,338 一般化して言うんじゃないよ。どんなコード読んでんだ。
>>339 お前は英語を勉強しろ。
>>340 あんた痛いよ。
参照は誰でも普通に使ってる。
ちなみに参照とはリファレンスのことだよ。
こんな事書かなくても分かると思うけど。
自己レス。 >それもconstの、ってことでいいよね? これは間違い。constじゃなかった。 $ perl -e '$a=0;&{sub{$_[0]=1;}}($a);print "$a\n";' 1
結局どうやればいいんでしょうか・・・
>>335 >>338 みたいな馬鹿は無視して私の質問に答えてほしいのですが。
345 :
デフォルトの名無しさん :03/11/30 11:46
>>332 ホレ
http:// (?:(?:(?:[a-zA-Z0-9]|[a-zA-Z0-9][-a-zA-Z0-9]*[a-zA-Z0-9])\.
)*(?:[a-zA-Z]|[a-zA-Z][-a-zA-Z0-9]*[a-zA-Z0-9])\.?|[0-9]+\.[0-9]+\
.[0-9]+\.[0-9]+)(?::[0-9]*)?(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0
-9A-Fa-f][0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa
-f][0-9A-Fa-f])*)*(?:/(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][
0-9A-Fa-f])*(?:;(?:[-_.!~*'()a-zA-Z0-9:@&=+$,]|%[0-9A-Fa-f][0-9A-F
a-f])*)*)*(?:\?(?:[-_.!~*'()a-zA-Z0-9;/?:@&=+$,]|%[0-9A-Fa-f][0-9A
-Fa-f])*)?)?
perlメモから
346 :
デフォルトの名無しさん :03/11/30 11:55
>>336 「ttpで始まるURL」などというものは存在しません。
あなたの要求は初めから間違っています。「URLで無い文字列」も
同時に抜き出したいなら、自分で正規表現を改造する努力をしてください。
たった一文字変えるだけです。
あるいは、あなたが正確な質問をするなら、誰かが答えてくれるかもしれません。
347 :
デフォルトの名無しさん :03/11/30 12:05
340のケースにしても、 @valuesの全ての値をいったんリスト値とみなして、 個々の値、それぞれにリファレンスを作成して関数呼び出し。 呼び出された側では、作成されたリファレンスの集まりを @_という変数でPerlのやってくれる自動デリファレンス機能で アクセスする。 なんて面倒な処理をさせたくない。リスト値を渡すとしても、 その全てを呼び出される関数内において使うとは限らない。 \@valuesと、参照で渡しておけば必要なものを最低限の コストでアクセスできる。と思うわけですよ。
348 :
デフォルトの名無しさん :03/11/30 12:16
>>340 func(\@values);
...
sub func{
my $arg_listref = shift;
foreach (@$arg_listref) {
いくらサンプルとはいえ、あなたには優雅さが欠けていますよ。
せめてこれくらい優雅に書き上げてもらいたいものです。
349 :
デフォルトの名無しさん :03/11/30 12:29
CやC++なら、コンパイラの挙動など知らなくても、 アセンブラソースを見れば、言語的なものがどういった具合に 扱われてるのか一目瞭然だけど、Perlerの人はどうするの? まさかperlのソースを読むとか? 楽駄本は4章までをかなり読んだけど、内部の細かいところは ソース見てくれって感じで扱ってないよね。まあセンスのある人なら インタプリタの挙動ぐらい、弄ってるだけで分るんだろうけど。
>>349 言いたい事が良く分からんのだが、perl -d でイイんじゃねーの。
>>349 言わんとするところは分かるが、方向が間違ってる
・Perlのソースを読まなくても、プログラムの挙動は理解出来る。
たとえば、length()って書けば、文字列の長さを返せばいいんであって、
中の人が strlen(3C)を使ってようが、何を使ってようが関係ない。
・言語を勉強する時に、アセンブラソースを見て理解するようでは頭が固すぎ。
as is で理解しよう。
とはいえ、中の実装が気になることも稀にある。デバグ時とか性能改善
図りたいときとか。でもソース読むより、strace で調べるくらい
352 :
デフォルトの名無しさん :03/11/30 14:41
354 :
デフォルトの名無しさん :03/11/30 14:53
strlen(3)のことか。
>>340 明示的にそんな書き方しなくても、関数へのパラメタは
参照渡しなので安心すれ。
@a = (1,2,3,4,5);
print join(",",@a),"\n";
test(@a);
print join(",",@a),"\n";
sub test { $_*=2 for (@_) }
>>354 そうとも言えるし、違うとも言える。
俺も正確なことは知らんが Solaris とかの man pages では
C library は 3C とかになってる。
あと X 関係は 3X11 とか。
>>355 微妙に違う。
個々のパラメータはそれぞれ参照になっているが、配列パラメータは新たなリストが作られる。
例えば…
@a = qw(1 2 3 4 5);
sub test{
push @_, 6; # $_[0]は$a[0]の参照だが、@_は@aの参照ではない。よってこれは無意味な操作
}
test(@a);
print "@a\n"; #-> 1 2 3 4 5
よって、巨大な文字列を扱う場合は特にリファレンスで渡しても効率はよくならないが、
巨大な配列を渡す際にはリファレンスで渡した方が効率はよくなる。
>>358 戻り値についてはどうなんでしょうか?
関数内においてmyで作成された変数のリファレンスを返すものと、
変数そのものを返すものの違いです。Perlは全ての変数を同一の
ヒープ領域に確保する(と思われる)ので、やっぱりreturnにおいても
暗黙のリファレンスが使われているのかな。
Perlにおいては 関数の引数や戻り値において使われている暗黙の参照=C++のリファレンス的 '\'において取得し*{}でデリファレンスするようなもの=C,C++のポインタ的 という考えで間違っていますかね。識者の人、おながいします。
XML::Parser::* と XML::SAX::* ってどう違うの?
ソース嫁
>例えば…
>@a = qw(1 2 3 4 5);
>sub test{
>push @_, 6; # $_[0]は$a[0]の参照だが、@_は@aの参照ではない。よってこれは無意味な操作
これはそうですね。仮にtestを呼び出すときに、test(@a,@a,@a);
とした場合など(いい例ではないですが)が分り易いですね。@_ != @aの例として。
関数呼び出しの時点で、概念上いったん平たく全ての値を並べて、それに対する
個々のリファレンス(Cでのポインタ)の配列を作成して、
それのアドレスをパースしたツリーに埋め込むという感じなのかな?
$_[]という構文要素は引数として渡されたリスト値の個々の値を指し示すものとして、
@_という構文要素は一時的に作られた(概念上の)配列の全体を示すというものとして、
とらえる感じでいいのかな?
>>362 そうですね。。。ソースを読むのが一番正しいことには違いないです
364 :
デフォルトの名無しさん :03/11/30 16:41
perlのソースを読める人がこんなところで、アフォな質問はしないと思うんだが・・・
>>364 私はアフォです。それは別にいいですが、360については
間違っていますか?間違っているならどうまちがっていますか?
Perlの仕様を熟知していないのであればコピーする方が無難。 f1(['a'..'c']); sub f1 { split //, 'xyz'; &f2; foreach (@{$_[0]}) { print "$_\n"; } } sub f2 { foreach (@_) { print "$_\n"; } }
>>359 戻り値に付いては基本的には値で返しているように見える。
ただしサブルーチンのアトリビュートにlvalueを指定すると参照を返すことになる。
もちろん、C++で参照を返す関数と同様、戻り値を変数に代入するとコピーが発生するわけだが。
my $f = "f";
my $g = "g";
sub f { $f } #1
sub g :lvalue { $g } #2
my $fref = \f();
$$fref =~ s/f/F/;
print f(), "\n", $$fref, "\n";
my $gref = \g();
$$gref =~ s/g/G/;
print g(), "\n", $$gref, "\n";
>>360 大体そんな感じ。戻り値に付いては上記参照。
>>362 細かな所は少しは読んでるけど、全体像をつかむのは辛すぎる…。俺には無理。
368 :
デフォルトの名無しさん :03/11/30 18:09
つーか、細かいこと気にするより書きたいように書いてる方がよっぽど効率がいいんじゃね? 本当に「実行」効率を考えなきゃならんのなら、そもそもスクリプト言語を使うなという話になる。 漏れは、スクリプト言語の利点は手軽さにあると思ってるから、書きやすさ、単純さを優先しがち。 要するに、リファレンス使うのが面倒くさいから必要がない限りは使わないというのが漏れの考え。
370 :
デフォルトの名無しさん :03/11/30 18:28
plを使うためにActive PerlをC:\Perlにインストールしたのですが、 コマンドプロンプト上から「ppm>enter」でppmプロンプトを呼び出そうとしても 「No Perl script found in input」と出てきて呼び出す事ができずに困っています。 原因を調べてみたのですがC:\Perl\binにpathを通せばいいらしいと言う事が分かっただけで・・・・ C:\Perl\binにPathを通すにはどうしたらいいのでしょうか? 初心者質問で申し訳ないです。
perlのリソキ(オライリー) ヤフオク>コンピュータ>本>言語>その他
373 :
332 ◆tr.t4dJfuU :03/11/30 20:07
さっきから332と言っている人が自分ではないのですが・・・・。 ともかくみなさんありがとうございました。
>>371 お使いのOSが2000/XPなら、コントロールパネル->システム->
詳細設定タブ->環境変数と書かれたボタンで環境変数にアク
セスできます。95/98(たぶんMeも)なら環境変数はc:\autoexec.bat
で設定されているのでテキストエディタで開いてpathに;c:\Perl\binを
書き足してください。
ただし、ふつう正常にActivePerlがインストールされた場合Path
は自動的に設定されます。インストールが正常に行われたかどうか
一度チェックしてみたほうがいいと思います。たとえば、コマンド
プロンプトからPerl -v[enter]でPerlのバージョン表記は出るでしょうか。
関数の引数、戻り値の扱いがどうなっているかは、 Devel::Peek::Dumpで見ると分かりやすいよ。 use Devel::Peek; sub a { Dump(\@_); } sub b { my $x = 'b'; Dump($x); $x; } sub c : lvalue { my $x = 'c'; Dump($x); $x; } sub d { my @a = qw(a b); print "[\@a]\n"; Dump(\@a); print "\n[a(\@a)]\n"; a(@a); print "\n[a(\\\@a)]\n"; a(\@a); print "\n[b()]\n"; my $x = \b(); print "\n[\$x]\n"; Dump($x); print "\n[c()]\n"; my $y = \c(); print "\n[\$y]\n"; Dump($y); } d();
376 :
デフォルトの名無しさん :03/11/30 22:02
教えてください。 $temp1, $temp2, $temp3 ・・・・・・ と自動的にしたいときに for($i=1;$i<10;$i++){ $temp$i=・・・・・・ とかじゃだめなんですけど、どうすればいいんですか?
377 :
デフォルトの名無しさん :03/11/30 22:16
>>376 コードを自動的に書き出すスクリプトを実行して、結果を貼り付けろ。
>>376 use strict;
my @temp = ('abc', 'def', 'ghi');
foreach my $temp (@temp) { print "$temp\n" }
my %temp = (a => 'abc', d => 'def', g => 'ghi');
foreach my $key ('a', 'd', 'g') { print "$temp{$key}\n" }
no strict 'refs';
use vars '$temp1', '$temp2', '$temp3';
$temp1 = 'abc';
$temp2 = 'def';
$temp3 = 'ghi';
foreach my $num (1, 2, 3) { print ${'temp' . $num}, "\n" }
>>376 素直に配列使えばいいんじゃ… とか言っちゃダメですか?
こういうことがしたいんと違うん? for($i=1;$i<10;$i++){ ${"temp$i"} = $i; } print $temp1, $temp2, $temp3;
>>376 for($i=1;$i<10;$i++){
eval("\$temp$i=・・・・・・");
stat '/path' は stat(2) を行う。 lstat '/path' は lstat(2) stat FH は fstat(2) ここまでは問題ないのですが、 lstat FH は何をするのかわかりません。
まじ感謝っす! みなさんドモ!
385 :
デフォルトの名無しさん :03/12/01 10:06
3桁区切りの値 1,000/-1,000,000 を 1000/-1000000 等の数値にしたいのですが、 スマートに書く方法を教えてください。
>>385 s/,//g;
じゃだめ?
クククのクーソ。。。
387 :
デフォルトの名無しさん :03/12/01 11:08
ありがとうございます。 確かにスマートでした。 クソでスマソー
388 :
デフォルトの名無しさん :03/12/01 11:09
Y氏 好循環 I氏 悪循環 (日本) (健康体) (喘息) 1.(神が喘息であるかないかを決める) Y I 2.喘息でない人 喘息の人は は体力がある 体力がない Y I 3. 行動力、 五感(嗅覚)が鈍り感性が変化 する Y I 4.神は異常な感性の人間は本来人に迷惑をかけるか ら外に出てはいけないと思っている。 Y I 5.変化なし アトピーになる Y I 6.正常な感性 外に出なくなりさらに異常な感 性になる Y I 7.正常な人間 異常な人間(レッテル)
389 :
デフォルトの名無しさん :03/12/01 11:09
Y I 8. 死 Y I 9. 来世 Y I 10.神は異常な人間は人に迷惑をかけるので行動を抑 制する必要がある Y I 11.神は異常な人間は人に迷惑をかけるので行動を抑 制する必要があると思っている。 Y I 12.神が喘息であるかないかを決める Y I 13.喘息でない 喘息である Y I 1.に戻る 神は事態の収拾に必死、頑張れよー。
390 :
デフォルトの名無しさん :03/12/01 11:10
アトピー性皮膚炎の治し方 行動力=ガッツ=体力 アトピー性皮膚炎の患者は、 感覚の鈍い人間が多い。 それはなぜか。 幼少期喘息になるから、 体力がつかないため、 五感が弱るからである。 解決方法は、 五感を強くしてやればいい。 体力をつけることですぐに五感が正常になり、 行動力も湧くのである。 五感が正常になり、体力もつけば、 アトピー性皮膚炎も不思議と消えることが多い。
391 :
デフォルトの名無しさん :03/12/01 14:02
jperl を使っているのですが length 関数で漢字一文字を1バイトとして 計算させるには、どうしたらいいですか?
392 :
デフォルトの名無しさん :03/12/01 14:39
>>366 &関数名 と関数呼び出しするときは無条件で空リストつけますよね。普通は。
@_がダイナミックスコープで嬉しいことってあるんでしょうかね。自分には分りません。
>>391 不可能!
もっとも、あんたがlength関数が漢字を考慮する様に
jperlパッチを書き換えれば話は別だが
>>391 大抵の文字コードでは、漢字は 2 byte 以上で符号化されているので
1 byte と答える関数は計算方法がおかしい。
…という話ではなく、漢字一文字を 1 文字として返したいのなら、
>>3 の各サイトを参考に length をオーバーライド。
>>392 それが誰にとっての普通かは知らんが、頻繁に呼び出される場合は
&func; の方が引数リストのコピー or 生成が行われない分効率良くなる。
395 :
デフォルトの名無しさん :03/12/01 17:12
WinNT 3.51でperl使える?
396 :
デフォルトの名無しさん :03/12/01 18:38
次のソースが、 v5.8.2 built for cygwin-thread-multi-64int だと駄目で、 v5.8.1 built for MSWin32-x86-multi-thread だとOKなのですが、 なぜでしょう。前者だと連想配列にアクセスしても空になる。 &init_words; print "Your Name? "; $name=<STDIN>; chop($name); print "Your word is $words{$name}\n"; sub init_words { open(WORDSLIST, "wordslist"); while($name=<WORDSLIST>) { chop($name); $word=<WORDSLIST>; chop($word); $words{$name}=$word; } close(WORDSLIST); }
>>396 先頭行に%words=();を入れりゃ動くと思うよ、どっちでも。
しかし、スパゲッティなスクリプトだな。
398 :
デフォルトの名無しさん :03/12/01 20:16
>>397 「%words=();」を入れただけでは駄目です。
ファイルを外出しにしたいのです。
というか、これLearning Perlという本に載っていたサンプルなんですけど。
さらに
foreach $key (keys %words) {
print "at $key we have $words{$key}\n";
}
とやると、at $keyの部分が丸々消え、なのに、$words{$key}
のところはちゃんと表示されます。
wordslist の改行が \x0D\x0A なら、そうなりそうな気がする。
Win32::Process で実行した外部プロセスの 標準出力ってどうやって得ればいいんだろうね もしくはsystem, execで得た実行結果の標準出力も
chop($name); で切ったのは、\x0D\x0Aの一文字だけ。
\x0D\x0A 二文字に見えるぅ
わしには8もじにみえるんじゃが
>>384 ありがとうございます。
fstat ですか。
fstat をしたい時にどちらを使おうか悩んでしまいそうだ。
>>396 &init_words;の次の行に
@words_keys = keys %words;
$n_keys = scalar @words_keys;
print "the number of keys is $n_keys\n";
print "@words_keys\n";
を入れて%wordsの中にブツが入ってるか調べたらどうよ。
中身を表示させるのはDebugの基本だぜ。
配列に存在するかどうかを調べる方法ってないの? use List::Util qw/first/; my @primary_colors = qw/red yellow blue/; defined(first { $_ eq 'red' }, @primary_colors); # true defined(first { $_ eq 'purple' }, @primary_colors); # false とかは思い付いたんだが、なんだかダサい。カコイイの教えて、エロい人。
>>408 要素数が多い時は遅い罠
順序等が重要じゃないならばハッシュにしてしまうのも手ではある
>>408 perlfaq4 は grep は使ってくれるな、とおっしゃってる。
左ローテートはどのようにやるんでつか?
スクリプトの出力を、そのスクリプトのファイル自身に 格納しておきたいんですがどうやればできますか? ファイルの末尾に__DATA__と書いておく方法では、 DATAハンドラは書き込みように開けない、といったようなエラーになりました。
一時ファイルに書き出しておいてから 元のファイル名へrenameしてできました。
>>411 @array = @array[1 .. $#array, 0] if @array > 1;
とかのこと?
push( @array, shift(@array) );
>>412 perl script >> script
420 :
デフォルトの名無しさん :03/12/04 00:49
Perlのコーディング規約例でよいものはないですか? ぐぐっても他の言語の事ばかり出てきて、Perlに関するものがひっかからない...
422 :
デフォルトの名無しさん :03/12/04 03:12
質問です chdir て日本語のディレクトリには移動できないんですか? できるとしたらどうやればいいんですか
425 :
デフォルトの名無しさん :03/12/04 15:00
質問ですが、 $codepath = argv[0];<----------------たとえば"C:\test\prog/game/" $codepath =~ s/\\/\//g; print $codepath; この結果で、求めているのは当然C:/test/prog/game/なんですが、 私の環境では、このとおりに表示されるのですが、 ある他人の環境では、C:testprog/game/となるのは、 なにか環境変数などの違いがあるのでしょうか? 一応ともに、win2000&cygwin&bashです。 LANGは設定していなく、MAKE_MODE = UNIXです。
# $/=undef $a=\`look pearl`; print $$a; #=>pearly v5.6.0の結果です。 コマンド置換のリファレンス先の内容が$/によって変わるみたい。 この、振る舞いは、ちょっと、あやしい気がする。
427 :
デフォルトの名無しさん :03/12/04 18:40
初心者の教えて君ですみません。 変数$pointの値を printで文字列と混ぜて出力する場合 どう記述すればいいのでしょうか? 例えば$point=10;の場合で あなたの得点は10点です。 というふうに出したいのですが・・
>>427 print "あなたの得点は${point}点です。";
>>425 my $original = $ARGV[0];
(my $replaced = $original) =~ tr|\\|/|;
print "[$original]=>[$replaced]\n";
>>426 #--- cmd.p ---
print join "\n", qw(list or scalar);
#--- test.p ---
local $/ = $ARGV[0] ? "\n" : undef;
my @str = `perl cmd.p`;
print map "[$_]", @str;
cmd.p の出力は改行が含まれているので、test.p で $/ の値がデフォルト
("\n") ならコマンド入力演算子が ("list\n","or\n","scalar") を返す。
$/ が undef なら "list\nor\nscalar" というスカラー値を返す。
#--- test2.p ---
my @ref = \('list','or','scalar');
my $ref = \('list','or','scalar');
print map "$_:[${$_}]\n", @ref, $ref;
リストリテラルに対するリファレンスは (\'list',\'or',\'scalar') の略記の
ように解釈される。リストをスカラー変数に代入した場合は最後の
要素が代入される。
よって、何らあやしくない。正常。
perl5.8 以降の safe signal が原因だと思うのですが、 例えば以下のようなコードを実行した場合 $SIG{'ALRM'} = sub { waitpid(-1,1); }; alarm(1); $_ = select(undef,undef,undef,10); print "error=$!\n"; perl5.6.2 だと、期待した通り error=Interrupted system call となるのですが、 perl5.8.2 だとシグナルハンドラ内の $! がそのまま返ってきているようで、 結果が error=No child processes になってしまいます。 これは仕様? バグ? 仕様だとしたら、システムコールの再実行条件が特定できねーYO
>>430 この辺に何か載ってない?
perldelta
perl56delta perl561delta
perl570delta perl571delta perl572delta perl573delta
perl58delta perl581delta
>>429 そのとおりやってみましたが、結果は一緒で、
[\\]が[/]にならず、ただ[\\]が消えただけです。
おれの環境下ではできているのですが、どうしてもある他人の環境下では[/]にうまく変換されません。
>>431 ありがとう。流しては読んでたんだけど、perlのキモチになって
もっかいよく読んだらわかった。
unsafe signalでは
・select開始
・sigalarmが起こる
・シグナルハンドラ実行
・select終了(Interrupted system call)
だったのがsafe signalだと
・select開始
・sigalarmが起こる。覚えとく。
・select終了(Interrupted system call)
・シグナルハンドラ実行
となっていたのでした。
$SIG{'ALRM'} = sub { waitpid(-1,1); };
alarm(1);
$_ = select(undef,undef,undef,10);
print "error=$!\n";
上のコードで言うと、selectとprintの間で
ハンドラが呼ばれているんだから $! が壊されて当然というわけか…
$SIG{'ALRM'} = sub { local($!); waitpid(-1,1); };
とすることで期待通りに動くようにしました。さんきう!
>>432 非常に不安なんだが
$codepath =~ s/\\/\//g;
の前に print $codepath; するとちゃんと入力した文字列が表示されてるのか?
入力するときのクウォートの仕方が違う、とかじゃないよね?
厨な質問でスマンが、誰か俺の質問にも答えてくれyo! それとも放置プレイですか
>>435 WinXP/ActivePerlで確認
require 'jcode.pl';
chdir(&jcode::sjis("C:/Documents and Settings/おまいのユーザ名/デスクトップ/新しいフォルダ"));
system("dir");
chdir("C:/Documents and Settings/");
system("dir");
これでどうだ?
437 :
デフォルトの名無しさん :03/12/05 10:19
お聞きしたいです。FILE2から特定のデータを持ってきて、FILE3の2番目の配列と完全マッチングをさせて そのときの行Noを取りたいのですが、うまくいきません。。。 if文の書き方が悪いのでしょうか? どうかよろしくお願い致します。 open(FILE2,"trace-no.txt"); open(FILE3,"java.txt"); $no = 1; while($line = <FILE3>){ if ($line =~ /^T/){ @number =split(/ /,$line); chop ($number[1]); chop ($number[1]); #print $number[1]; #print "\n"; #for($i=0; $i<@trace; $i++){ while($traceno = <FILE2>){ chomp($traceno); print $traceno; if($number[1] =~ /$traceno/){ push @number1,$number[1]; push @gyou,$no; print $traceno; print "\n"; last;
そうか。eucでスクリプトを書いたならsjisに変換しないと
いけなかったわけですか。というかよく俺がwin使っててeucで
スクリプトを書いてるとわかったね。
名探偵ホームズですか?
>>436 とにかく、ありがとう! 出来ました。愛してるよ!
>>439 すいません。途中で切れてしまいました。
open(FILE2,"trace-no.txt");
open(FILE3,"java.txt");
$no = 1;
while($line = <FILE3>){
if ($line =~ /^T/){
@number =split(/ /,$line);
chop ($number[1]);
chop ($number[1]);
#print $number[1];
#print "\n";
#for($i=0; $i<@trace; $i++){
while($traceno = <FILE2>){
chomp($traceno);
print $traceno;
if($number[1] =~ /$traceno/){
push @number1,$number[1];
push @gyou,$no;
print $traceno;
print "\n";
last;
}#if-number[1]
}#for-$traceno
}#if-$line
++$no;
close(FILE2);
close(FILE3);
よくわからないけどこんな感じかねぇ? open FILE2,"2.txt"; open FILE3,"3.txt";#ファイル3:スペースで区切ってある while(<FILE2>){ chomp; push @trace,$_; } while (<FILE3>){ chomp; @array = split/ /; ++$i;#行番号 for($n=0;$n<$#trace+1;$n++){ if ($array[1] =~ m/^$trace[$n]$/){ print $i," ",$array[1],"\n"; } } } close FILE2; close FILE3;
>>437 日本語が良く分からん。
trace-no.txt と java.txt の一部を晒して、どういう出力を期待してるのか
書いた方がいいと思うぞ。
s/foo/bar/ よりも s{foo}{bar} の方がカッコイイと思うのは俺だけですか?
>>444 回数指定に困るんだよな、見やすいけど。
s, foo, bar, x かなぁ、いつも。
447 :
デフォルトの名無しさん :03/12/05 16:12
perl for windowsで、現在存在している他のアプリケーションの ウィンドウをタイトルで検索したり、ウィンドウに対してキーイベント等を送ったり する方法はありますか?
TRACE 18216: org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119) javax.servlet.http.HttpServlet.service(HttpServlet.java:853) org.apache.jasper.servlet.JspServlet$JspCountedServlet.service(JspServlet.java:130) TRACE 17957: org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:119) javax.servlet.http.HttpServlet.service(HttpServlet.java:853) java.txtはこんな感じです。 で、ここのTRACEの次の数字をtrace-no.txtの中からマッチングさせてその行が取りたい。 17957なら5行目って感じで。 あと、trace-no.txtは 0 16409 6148 2114 2113 32980 32997 6147 6146 6146 6145 32992 16465 32991 な感じです。
>>448 > 17957なら5行目って感じで。
訳分からん。プリゼン能力0だな
my %trace_no; open FH, "<trace-no.txt" or die $!; while (<FH>) { chomp; $trace_no{$_} = 1; } close FH; # test #print "[$_] [$trace_no{$_}]\n" for sort keys %trace_no; open FH, "<java.txt" or die $!; while (<FH>) { if (/^TRACE\s+(\d+)/ && $trace_no{$1}) { print "$.\n"; } } close FH; こんなんかな?
open FHJ, "java.txt" or die; open FHT, "trace-no.txt" or die; while ($_ = <FHJ>) { /^TRACE\s+(\d+):$/ and $lines{$1} = $.; } while ($_ = <FHT>) { chomp; print $_, " -> ", ($lines{$_} || "not found"), "\n"; }
452 :
デフォルトの名無しさん :03/12/05 22:58
447おしえてください。
>>452 教えてもらって当然と思ってないかおまいは
とりあえずWin32モジュールあたり調べてみろ
親切だな(w
>>450 >>451 ありがとうございます。
ハッシュをうまく使うといいんですね。
参考になりますた。
すいません、ちょっとお聞きしたいのですが、 @array1 =(1,6,11,3); @array2 =(4,9,14,6); このように配列が定義されているとき、 hoge.datファイルを読み込ませて$array2-$array1の行を出力させるにはどのような 処理をさせるとよいのでしょうか? open IN,"hoge.dat" or die; while(<IN>){ for($i=0; $i<$array1; $i++){ if (($array1[$i] < $j) && ($array2[$i] > $j)){ print "$_; } } j++;} close IN; こうだとうまくいかないです。何かいい方法はないでしょうか? よろしくお願いいたします。
$array1 やら $array2 はどこで定義されているんですか?
とりあえず全部詠む必要ないきもするけど open my $fh, '<doc.txt' or die $!; my @files = <$fh>; close $fh; for my $i(0..$#array1){ print join '', @files[ $array1[ $i ]..$array2[ $i ] ]; }
459 :
デフォルトの名無しさん :03/12/06 19:19
>>457 すいません、配列$array1ではなく@array1でした。
配列の定義は下のようにしています。
#!/usr/bin/perl
@array1 =("1","6","11","3");
@array2 =("4","9","14","6");
>>458 そのようにすると、最初の@array1[0]と@array1[1]との数値になってしまいます。
2hoge2
3hoge3
4hoge4
5hoge5
7hoge7
8hoge8
9hoge9
10hoge10
12hoge12
13hoge13
14hoge14
15hoge15
4hoge4
5hoge5
6hoge6
7hoge7
open IN,"in.txt"; @files = <IN>; close IN; unshift(@files, "0行目\n"); for $i(0..$#array1){ print $files[$array2[$i]-$array1[$i]]; }
>>456 hoge.datに何が書いててどう使うのかさっぱりワカラン
転載してるコードが文法ミスってる
>こうだとうまくいかないです。
走らせてみたってことでしょ?どんなエラー出たのか書いてみたら?
>>461 hoge.datにはApacheのエラーログの内容です。
127.0.0.1 - - [06/Aug/2002:15:02:20 +0900] "GET /~alchu/welcome5.htm
127.0.0.1 - - [06/Aug/2002:15:02:33 +0900] "GET /~alchu/welcome3.htm
127.0.0.1 - - [06/Aug/2002:15:02:38 +0900] "GET /~alchu/welcome2.htm
127.0.0.1 - - [06/Aug/2002:15:40:02 +0900] "GET /doc/ HTTP/1.1" 200
です。ここから特定のIPアドレスの行を取るところまではいきました。
ですが、あまりにファイルの容量が大きいため、全文検索はやめたいと思い、
悩んでいます。
>>460 はエラーはでませんでした。
表示結果は上記の用になりました。
やはり、下記のように全文検索を行うしかないのでしょうか?
#!/usr/bin/perl
@array1 =("1","6","11","3");
@array2 =("4","9","14","6");
for($i=0; $i<@array1; $i++){
open IN,"hoge.dat" or die;
$j=0;
while($_= <IN>){
if (($array1[$i] <= $j) && ($array2[$i] > $j)){
print $_;
}
$j++;
}
print "-------------------\n";
close IN;
}
>>462 どういう出力を期待してる?
>>456 の「$array2-$array1の行」の意味がワカラン。
1行目から4行目、6行目から9行目… を出力させたいってこと?
>>462 my %num;
for (my $i = 0; $i < @array1; $i++) {
my @num = $array1[$i]..$array2[$i];
@num{@num} = (1) x @num;
}
open IN, '<' . $file or die $!;
$num{$.} and print "$.: $_" while <IN>;
もしくは
my(%num, @pickup);
for (my $i = 0; $i < @array1; $i++) {
my @num = $array1[$i]..$array2[$i];
@num{@num} = (1) x @num;
push @pickup, [ @num ];
}
open IN, '<' . $file or die $!;
my @line = ('dummy');
$num{$.} and push @line, $_ while <IN>;
print map "$_: $line[$_]", @{$_} for @pickup;
perl/tkのtext widgetで、 表示されてる内容の中のURL部分をクリックしたら、 そのURLをもとにブラウザを起動したいと思います。 そこで、そのURLの文字列をゲットする関数について、 どうすれば作れるか知りたいんです。お願いします。
「Perlについての質問箱」シリーズもかなり息の長いスレになってきますた。 ここで勝手連的にこのスレのサポートページを作ろうと思っています。 いま考えているのは、 1. このシリーズの過去ログアーカイブ 2. スレッド専用ソースコードうpろだ 3. 過去ログのダイジェスト (Q&Aにまとめたもの) 4. リンク集 こんなところかな。 きながにまっててください。
>>466 おお、超期待。既出質問の誘導先は決まったな。
気長には待てないのでゆっくり急いでください。
>>466 最初から完成したものを作ろうと思わずに、
とりあえず作って徐々に完成させていけばいいと思うよ。
>>466 こういうのあると助かるよなー
実際仕事で助言頂きたくてこのスレ見ることあるし
ガンガレ
先輩方教えて下さい 文字列abcdefを左に2ビットシフトさせてcdefabと表示させるには どうしたらよいですか? $a = $a << 2; これじゃ駄目ですか?
それはビットシフトではない。 $a =~ s/^(.{2})(.*)$/$2$1/;
>>472 $str =~ s/^(..)(.*)\z/$2$1/; #
>>473 とほぼ同じ
$str .= substr $str, 0, 2, '';
できたです!!上の通りやったら出来たです! 本当にありがとうございました! $_ #この変数?って基本ですか?
ご教示お願いします。 以下のperlでprintString1という関数を実行した場合、ファイルの最初の1行を 読み込んだ後、2行目以降を読み込まないのはどうしてでしょうか? 代わりにprintString2を実行すると3行表示されるのですが。。 open($handle,"input1.txt"); for(my($i)=0;$i<3;$i++){ printString1($handle); #printString2($handle); } print "fin\n"; sub printString1{ my($handle)=shift(@_); my($str)=<$handle>; print $str; } sub printString2{ my($handle)=shift(@_); $str=<$handle>; print $str; }
わかったのでちゃんと報告します。 Win32::GuiTestが目的のものです。 べんり。
481 :
デフォルトの名無しさん :03/12/08 18:31
正規表現じゃない単なる文字列の置換をしたいのですが そのような関数ってありますか?
質問箱に質問です [1-4]asd[1-5]の部分だけをシフトさせたい時は,下のプログラムをどのように書き換えたらよろしいですか? 下のプログラムだとasdf jklの部分からシフトしてしまいます if(/asdf jkl [1-4]asd[1-5]/) $_ =~ s/^(.{2})(.*)$/$2$1/; print "ID is $_\n";
自分で作りました・・・ sub replace { my($str, $a, $b) = @_; my($offset, $length, $pos, $inc); $length = length($a); $pos = 0; $inc = length($b); while (1) { $offset = index($str, $a, $pos); if ($offset == -1) { last; } substr($str, $offset, $length, $b); $pos += $inc; } return $str; }
s/hoge/fuga じゃイカンのかと小一時間問い詰めたい
どっちが早いんだろう
Benchmark 取るがよろし
split して join ってのもあるが、split の第1引数が正規表現パターンだからダメか・・・
my $db = tie (%h, "DB_File", "test.db", O_RDWR|O_CREAT, 0644, $DB_BTREE) || die "error\n"; とやるとエラーになります。 カッコでくくらないと大丈夫なんだけど…これは環境によるものなんでしょうか?
カッコ外しても大丈夫じゃなかった…%hに何入れてもtest.dbが空のまんまだった…
>>484 Benchmark 取ってみますた
use Benchmark;
$str = "hogehoge";
timethese(1000000, {'test1' => '®exp($str, "hoge", "fuga");', test2 => '&replace($str, "hoge", "fuga");'});
sub regexp{
my($str, $a, $b) = @_;
$str =~s/$a/$b/g;
return $str;
}
#sub replaceは
>>484 のやつ
Benchmark: timing 1000000 iterations of test1, test2...
test1: 4 wallclock secs ( 4.53 usr + -0.01 sys = 4.52 CPU) @ 221385.88/s (n=1000000)
test2: 7 wallclock secs ( 6.17 usr + 0.02 sys = 6.19 CPU) @ 161603.10/s (n=1000000)
Benchmark 最近覚えたもんだからサブルーチンの比較対象が違うかもしれないが
もし違ってたらご指摘おながいします
>>485 例えば、'.'から'_'に置換する場合、
'.'は'\.'にしてやらないといけませんよね。
ただそれだけです。
てゆーか、Perlにreplace相当の関数が標準でないことが不思議です。
先輩方教えてください if(/ABCD [0-3][0-3][0-3]/){ s/$&//; #←ここで文字列全体($&)ではなくて数字の部分だけを指定するには,/$&/ /;ここに何を入れたら よかですか?
497 :
デフォルトの名無しさん :03/12/09 00:10
open(STDOUT, "| tee ${sname}.html") || &errorpage("teeのバグ"); open(STDOUT, "| tee ${bname}.html") || &errorpage("teeのバグ"); print "Content-type:text/html\n\n"; ・ ・ (&errorpage()はまんまエラーページ表示のやつで、$sname・$bnameは名前の文字列っす) でCGIプログラムエラーが起きてしまいます・・・ 問題箇所は間違いなくココなんすけど。 教えてくださいッ!
うっわ、思いっきり板違いですやん・・・ マジすみませんでした
>>496 ありがとうございます
そこ見て取り掛かってるんですけど,どうしてもできません.
数字のみって指定は\dとかいてあるけど,これを指定したら文字列として扱われてしまうし・・・
ヒントだけでも頂けませんか
>>500 > 数字のみって指定は\dとかいてあるけど,これを指定したら文字列として扱われてしまうし・・・
ハァ?
$_ = 'ABCD 231'; print "$_ => "; if(s/(?<=ABCD )([0-3]{3})/$1/){ #痴漢が行われた時の処理 print "$_\n"; } else { #痴漢なし }
>>503 痴漢が行われたときの処理は現行犯逮捕でしょ
今日は 寒いねぇ。冬本番って感じだな
初心者ですいません。 とあるプログラムを起動しようとしたら Can't locate Win32/API.pm in @INC … と言うエラーメッセージが出たのですが何が原因なんでしょうか? 翻訳してみたのですが解決方法が解らないのでご教授願いたいと思います。
>>506 Perlというのはまあ、「らいぶらり」とか「モジュール」という名のサブルーチン群を読みながら実行するわけだが、
そのサブルーチン群というのは @INC のディレクトリに格納されている (はず) なわけだ。
君が実行したいプログラムは "Win32/API.pm" というモジュールを読みたがっているようだが、
君のシステムにそれがインストールされていない、とPerlが逆ギレを起こしたんだね。
それから、質問の仕方について。
1. どういう環境ですか (Win/UNIX/Mac)
2. どういうバージョンのPerlですか (perl -v した結果。場合によっては Perl -V だけど、いきなりこれをやると迷惑)
3. どういうプログラムを動かそうとしたのですか (または、どこのサイトから拾ってきたプログラムか)
こういう基本的なことを書いてくれないと返事できなくて激怒する住人がいるので気を付けて下さい。
それから、学校の宿題は友達に聞いてくれ。
509 :
デフォルトの名無しさん :03/12/09 21:23
my qw(aaa bbb ccc); こういう書き方ってできないんでしょうか?
>>507 的確なレス有難うございました。
507さんの回答から検索範囲が狭まってなんとか解決できました。
次質問するような事があれば、基本的な事が判る様な書き込みにしたいと思います。
スレ汚し失礼しました^^;
>>509 は
my qw($aaa $bbb $ccc); の間違い。スマソ
511だけど、とんでもない勘違いしてました。吊ってきまs
use DB_File; use Fcntl; my %db_imp; tie (%db_imp, "DB_File", "imp.db", O_RDWR|O_CREAT, '0644', $DB_BTREE) || die "Can not open\n"; これだけのコードですけど、dieがかかってしまいます… imp.dbは生成されるんですけど、 パーミッションが--w----r-Tでサイズ0になってます。
自己解決しました。 パーミッション指定部をシングルクォートでくくるのがまずかったようだけど…どうしてだろ
515 :
デフォルトの名無しさん :03/12/10 15:11
regexについての質問です。 文字列の中に括弧でくくられたものが「(xxxx(xxxx(xxx)xxx))」などとあった場合、 括弧でくくられた中身をとりだすにはどうしたらよいでしょうか? 具体的には、一番外側の括弧でくくられた文字列を取り出したいと思っています。
>>514 0644 は 8進数リテラル
'0644' は文字列 → 10進数として解釈 → 8進数換算で 01204
>>515 my($part) = $str =~ /^[^(]*\((.*)\)/;
517 :
デフォルトの名無しさん :03/12/10 16:54
ご質問させて下さい。 ある文字列があり、その文字列の大きさは決まってません。 その文字列を(例えば)2バイト毎に分割したい場合はどうすれば良いのでしょうか。 $str = '0123456789'; # このような文字列を、、 @strs = qw(01 23 45 67 89); #このように分解したいのです。
518 :
デフォルトの名無しさん :03/12/10 17:14
@strs = unpack("(a2)*", $str);
>>517 こんなのとか?
$str = '0123456789';
@data = $str =~ m/.{2}/g;
>>518 迅速な回答有難うございます。
unpackのテンプレートはそのように使えたのですね、大変勉強になりました。
別解: @strs = ($str =~ /../g); 奇数文字の場合、最後の一文字も入れたければ @strs = ($str =~ /..?/g);
あう、リロードする前に出しちゃった。 スマソ
523 :
デフォルトの名無しさん :03/12/10 17:33
There's more than one way to do itか
☆ チン マチクタビレタ〜 マチクタビレタ〜 ☆ チン 〃 ∧_∧ / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ヽ ___\(\・∀・) < サポートページまだ〜♪ \_/⊂ ⊂_ ) \_____________ / ̄ ̄ ̄ ̄ ̄ ̄/| | ̄ ̄ ̄ ̄ ̄ ̄ ̄ | | Perlの質問箱 |/ もう少し待っててくらはい。すみません。
gzipを扱うにはどうすればいいですか?
526 :
デフォルトの名無しさん :03/12/10 21:17
>>526 いやPerlじゃなくてPHPで使いたいんだけど・・・・
氏ね
531 :
デフォルトの名無しさん :03/12/10 23:13
●●△▽◎◆□▽●●◆○△ 左右対称に反転させて表示させるって分からないよ。。。(´ω`) 引数がどうだら?って何が何だか。。。泣きたいyo
print join("", reverse(split(/ */, $x))), "\n";
533 :
デフォルトの名無しさん :03/12/11 01:16
print join("", reverse(split(/ */, $x))), "\n"; これはどこでどうやって使うのでしょうか? print join("●●△▽◎◆□▽●●◆○△", reverse(split(/ */, $x))), "\n"; ???(´д`)ヾ???
>>531 =533
もっと基礎からやれ。
$x = "●●△▽◎◆□▽●●◆○△";
536 :
デフォルトの名無しさん :03/12/11 02:19
538 :
デフォルトの名無しさん :03/12/11 14:09
INFILE(ファイル名a)の内容が I am 1poooo1234. I am 1qoooo1254. I am 1poooo1256 and 1poooo7896. メインの方をwhile文から書くと, while<INFILE>{ chomp; if(s/([1-2]{1})(po)(ooo)([0-9]{4})/$3$4$1$2/g){ print OUTFILE"$_\n"; #OUTFILEはファイル名b } } このプログラムだと,INFILEの1行目と3行目は変更されて(ooo12341po)などと表示されるのですが, 2行目は表示されません.if文で一致していないから表示されないのでしょうか? どのように変更すれば2行目(I am 1qoooo1254.)も表示されるのでしょうか. ご教授お願いします.
>>538 君は p と q が同じに見えるのか?
>>539 えーっと,pとqは違いますよ.
2行目は変更しないで表示させたいという事です.
上の例でやると2行目そのものが表示されないのです.
>>540 パターンに合わない文字列はそのまま表示させたいならif文にしなければいい
while(<INFILE>){
chomp;
s/([1-2]{1})(po)(ooo)([0-9]{4})/$3$4$1$2/g);
print OUTFILE"$_\n"; #OUTFILEはファイル名b
}
s/hoge/fuga/g は置換するだけじゃなくて、置換した回数も返してる。
>>538 のようにifの条件式のなかで置換させると置換が行われないパターンは偽(0)になって、
真の時の処理のprint文がすっとばされてる。
失礼 ) がひとつ多かった 誤: s/([1-2]{1})(po)(ooo)([0-9]{4})/$3$4$1$2/g); 正: s/([1-2]{1})(po)(ooo)([0-9]{4})/$3$4$1$2/g;
>>541-542 なるほど!
if文の中で置換してしまうと一致しないパターンは飛ばされてしまうんですね.
とても勉強になりました.本当にありがとうございました.
感謝です
>>531 use 5.008;
use encoding 'euc-jp';
my $x = '●●△▽◎◆□▽●●◆○△';
my $y = reverse($x);
print "$x\n$y\n";
perl5.6.0のperlfuncのsplitの説明には perl -le '@a=split(??,"abc");print @_' #=>abc となると書かれているように思うがならないんですけど。
547 :
デフォルトの名無しさん :03/12/11 19:34
Cの関数内static変数と同じことはPerlでどうやればいいですかね。 closureを使う方法でもいいですが、そうすると関数リファレンスを 代入した変数をグローバル変数として持たないといけないような気がします。 何かいい方法はないでしょうか?
>>548 これです。探していたのは。どうもありがとうございます。
550 :
デフォルトの名無しさん :03/12/11 19:40
>>547 perldoc perlfaq7 の How do I create a static variable を
目を皿のようにして読め。
あ、でもourって5.6から追加された機能なんですね。 みなさん、5.00Xはそろそろ切り捨てですか?
553 :
デフォルトの名無しさん :03/12/11 20:14
小数点以下を切り上げるにはどうしたらいいのでしょうか???
554 :
デフォルトの名無しさん :03/12/11 20:43
>>553 $x = (int $x == $x) ? $x : int($x) + 1;
555 :
デフォルトの名無しさん :03/12/11 20:56
LWP(libwww-perl)をインストールしてる最中に下記のようなエラーが 出てしまいました。原因がサッパリわからないんですが、どなたか ご存じないでしょうか。長文でスイマセン。 # perl Makefile.PL && make # make test base/common-req........ok 中略 robot/ua-get...........HTTP Server terminated FAILED tests 1-3, 5, 7 Failed 5/8 tests, 37.50% okay robot/ua...............HTTP Server terminated FAILED tests 1-3, 5, 7 Failed 5/7 tests, 28.57% okay local/http-get.........Can't call method "is_redirect" on an undefined value at local/http-get.t line 216, chunk 1. HTTP Server terminated dubious Test returned status 57 (wstat 14592, 0x3900) DIED. FAILED tests 1-19 Failed 19/19 tests, 0.00% okay local/http.............Can't call method "is_redirect" on an undefined value at local/http.t line 189, chunk 1. HTTP Server terminated dubious Test returned status 57 (wstat 14592, 0x3900) DIED. FAILED tests 1-18 Failed 18/18 tests, 0.00% okay local/protosub.........ok 中略 all skipped: no reason given Failed 4/39 test scripts, 89.74% okay. 47/415 subtests failed, 88.67% okay. Failed Test Stat Wstat Total Fail Failed List of Failed ------------------------------------------------------------------------------- local/http-get.t 57 14592 19 30 157.89% 1-19 local/http.t 57 14592 18 28 155.56% 1-18 robot/ua-get.t 8 5 62.50% 1-3 5 7 robot/ua.t 7 5 71.43% 1-3 5 7 1 test skipped. *** Error code 35
556 :
デフォルトの名無しさん :03/12/11 22:21
ファイルを読み込んで、それの内容を変更して 別の名前で保存するってどうやれば良いんでしょうか?
557 :
デフォルトの名無しさん :03/12/11 22:21
open,read,write
558 :
デフォルトの名無しさん :03/12/11 22:33
open(F, "a.txt") || die "メッセージ"; while (<F>) { print; } でread、write、にすれば一連の流れで出来るんですか?
559 :
デフォルトの名無しさん :03/12/11 22:35
open(F, "a.txt") || die "メッセージ"; while (<F>) { print; } でread、write、にすれば一連の流れで出来るんですか?
なんで or ではなく || をつかう人が多いのだろう?
561 :
デフォルトの名無しさん :03/12/11 22:39
562 :
デフォルトの名無しさん :03/12/11 22:43
ああ出来ない!ファイルを読み込んで内容を変更して書き出しが出来ない!
orと||は優先順位が違うッス
-f "読み込みもとファイル名" or die "ないです"; local *Source_data; open Source_data, "読み込み元ファイル名" or die "$!"; my $Source = join '', <Source_data>; # いっぺんに読み込むのでメモリ容量に注意。 close Source_data; # $Source を書き換え。 open Destination_data, ">書き出し先ファイル名" or die "$!"; print Destination_data, $Source; close Destination_data; みたいな?
565 :
デフォルトの名無しさん :03/12/11 23:11
結局駄目ぽΣ(゚Д゚)ガーン
566 :
デフォルトの名無しさん :03/12/12 00:43
Perlのプログラムそのものを字句解析・構文解析したいのですが 良い方法ないでしょうか?
>>556 1. ファイルオープンして読みこみ
2. 内容を変更
3. 書きだし先ファイルオープン
4. 3.へと書き出す
5. ファイルクローズして終了
writeはちがうだろ。
open(IN,$in) or die; #元ファイル open(OUT,>,$out) or die; #出力先ファイル while(<IN>){ #例として ....... ....... print OUT $_; } close IN; close OUT;
<Event status="happened" startTime="01:23:45" eventType="song"> <s:Song title="Unfinished sympathy"> <s:Artist name="MASSIVE ATTACK"> <m:Media runTime="307.68"/> </s:Artist> </s:Song> </Event> これが10個連続しているxmlのプレイリストを、 01:23 : MASSIVE ATTACK - Unfinished sympathy [5:07] ・ ・ ・ ・ ・ ・ ・ ・ と整形して表示するスクリプトを作りたいのですが、 上手くハッシュにして抜き出すには何を使うのがベストですか? (clipコマンドって複数にマッチしたら最初のしか抜き出さないのかなぁ・・)
お手軽にXML::Simpleはどうでしょ。 use XML::Simple; my $songlist=XMLin('./songs.xml'); foreach $song (@{$songlist->{'Event'}}){ print $song->{'s:Song'}->{'s:Artist'}->{'name'}." - "; print $song->{'s:Song'}->{'title'}."\n"; } こんな感じで MASSIVE ATTACK - Unfinished sympathy MASSIVE ATTACK - Protection みたいに表示されます。
572 :
デフォルトの名無しさん :03/12/13 00:21
Perlを勉強し始めたばかりのものです。 とあるページで定数の宣言に *MAX_BUF = \1024 print $MAX_BUF, "\n"; という記述があったのですが、どうしてこれが定数になるのでしょうか?
>>573 できました。
XML::SimpleとXML::Parserとexpatをインスコするんですね。
use XML::Simple;
$content = `curl -L ¥"
http://www.radiofg.com/rcs/XMLSongs.xml¥ "`;
my $songlist=XMLin($content);
print "[ Radio FG Playlist ]¥n¥n";
foreach $song (@{$songlist->{'Event'}}){
print substr($song->{'startTime'},0,5)." : "; # 秒数は省略
print $song->{'s:Song'}->{'s:Artist'}->{'name'}." - "; # アーティスト名
print $song->{'s:Song'}->{'title'}; # 曲名
$length = $song->{'s:Song'}->{'s:Artist'}->{'m:Media'}->{'runTime'}; #演奏時間を変換
print " [".int($length/60).":".int($length%60)."]¥n";
}
素人OSX使いなので勉強になりました。ホント感謝です。
http://live.radiofg.comのソースを使ってました 。
(一桁秒数が未修正ですが‥)
ttp://mac.oheya.jp/etc/img-box/img20031213004626.jpg
おー、なんだかかっこいいですね。 秒数はprintfを使って printf "[%2d:%.2d]", $length/60, $length%60; なんてやるとお手軽に桁がそろえられますよ。
576 :
デフォルトの名無しさん :03/12/13 19:48
577 :
デフォルトの名無しさん :03/12/13 21:15
最近Windows環境でPerlスクリプトを書く機会が多いんだが 「Win32 Perlアドミニストレータハンドブック―PerlによるWindowsシステム管理の自動化」 この書籍は果たして買いでしょうか、迷ってます
578 :
デフォルトの名無しさん :03/12/14 10:34
質問なのですが、同じ内容の中身が複数ある配列を検索して 検索にヒットしたもののうち1つだけを削除するのに何か上手いやり方ないでしょうか? たとえば、 @array = ("あああ","あああ","いいい","ううう") とある場合、あああで検索かけてあああを一個だけ消したいのですが・・・
579 :
デフォルトの名無しさん :03/12/14 11:05
perlであと何年ゴハン食べれますか?
580 :
デフォルトの名無しさん :03/12/14 11:21
>>579 別にPerlを使えるから飯食えるわけじゃない。
Perlを使って何が作れるの?っていうことが問題だ。
>>578 ハッシュじゃだめなの?
たとえば
%data = ('あああ' => 2, 'いいい' => 1, 'ううう' => 1);
みたいにキーは文字列、値は重複カウント数をとるようなデータを
作っておいて該当するキーが見つかったら重複カウントをデクリメントする
みたいな
>>578 my @array = qw(a b c d a b c d a b c d);
my $search_word = 'a';
# 頭から消す
for my $i (0..$#array) {
$array[$i] eq $search_word or next;
splice @array, $i, 1;
last;
}
print "@array\n";
# 尻から消す
for my $i (reverse 0..$#array) { (同上) }
Terminating on signal SIGBREAK(21) ってエラーがでてしまうんですが、たちけて
>>584 要素をユニークにすることが
>>578 のやりたいことだとは限らない。
1. 特定要素で検索することに意味があるのか?
2. 一つだけ残す、ではなくて一つだけ「削除」であることに意味があるのか?
3. 検索にヒットした要素が一つだけである場合削除するのか?
参考になるのは間違いないとは思うけどね。
>>582 さんのspliceってやつを使ったらできました!ありがとうございます!
しかし参考にしてる本にはどこにもspliceなんて載ってなかった・・・
丸1日つぶれちゃってかなり鬱です。
マジかよ。spliceなんて push, pop, shift, unshift と並んで 配列処理の基本関数だろ。JavaScriptにも同名のメソッドがあるのに。 そんな本は乞食の燃料用に捨ててしまえ。
W3Cの作る仕様を読まずにHTMLの本を書くことと、 Perlの言語仕様もろくに知らずにPerlプログラミングの 入門書を書くこと、どっちが有害かな?
HTMLだろ、騙されるヤツの数が違いすぎる
掲示板作ったんですが、最初から〜十個までは表示できるのですが 11個〜20個という方法が思いつきません。 1から20まで読んで1〜10は廃棄、という方法のほかに何かあるものなのですか? それと削除機能もですけど、削除されたところを除外して、他のログを上書きという 方法のほかに何かあるでしょうか
>>590 ・レコードを固定長にしてシーク。
・削除マークをつける。
593 :
デフォルトの名無しさん :03/12/15 03:11
Perlでiniファイルや、confファイルを読み込みたいのですが、 Javaでいうところのリソースバンドルのような動作するツールはないでしょうか? よろしくお願いします
>>579 Perlそのものでメシ食ってる人は知らない。
(そこら辺 C や COBOL, Java と違う)
ただ、Perl を知らないと10日かかる仕事を1秒で終えた人ならたくさん知っている。
597 :
デフォルトの名無しさん :03/12/15 10:14
依頼人「10日くらい前からなんですが、デスクトップになんか変なアイコンができちゃったんです」 Perlを知っている人「これはねえ、こうやってゴミ箱に動かせば消せるんですよ」 解決に一秒。驚異の早業師”Perlを知っている人”恐るべし。
>>598 Perl使ってる人を馬鹿にしてるんだろうけど、Perl関係ないじゃん。
>>596 そういうケースの9割以上はshで片付けられるかな。
Perlの方が楽だけど。
PerlでCGIばっかりやってると、プログラミング能力落ちるよな。 CGIなんて所詮ただのバッチ処理だから。ベタに書くのが 一番速かったりするし。
>>600 sed,awk使ってもいいならshでも余裕だね
俺は面倒だから全部Perlでやるようになった
おかげでawkすっかり忘れた
>>575 あ、そんなんありましたね。どうも。
独学なもんで基本が‥‥わざわざサブルーチン作ってました。
>>576 モロ間違えました。
>>603 ってまた間違えたり。無線LANケーブルで首吊ってきます。
ありがとうございました。板違い申し訳ないです…。帰ります…。
>>596 どきっとしますた(汗)
おかげで余計な仕事までさせられています(泪)
607 :
デフォルトの名無しさん :03/12/15 21:09
parrotを使ってみてるひとここにいますか?
PERL:DBI について詳しい方がいらっしゃいましたら 教えていただきたいのですが。 データベースハンドルを二つ以上、発行して、異なるデータベース の情報にアクセスすることは可能なのでしょうか? ちなみに自分が作ったPGを起動すると、一つのDBの情報はもってこれるの ですが、片方のDBについては、以下のエラーにより、取得できません。 PGでは、データベースハンドルを2個取得して、SQL文を個々の セッションで発行するようにしています。 [エラー] Can't call method "prepare" without a package or object reference at mts_kanyuu.pl line 49. Issuing rollback() for database handle being DESTROY'd without explicit disconnect().
CGIにしても、最近はほぼ100%,LinuxかFreeBSDが使われてて そういうい場合はPerlもあたらしめのことが多いから、 5.00Xはもう考えなくてもいいのかな。5年ぐらい前までは WebサーバにHP-UXにPerl4なんて組み合わせもあったんだけどなあ。 もう昔話だね。
>>609 うろ覚えだが、FreeBSD 5.x 系って perl 4.x に戻したんじゃなかった?
>>610 FreeBSD 4.x は Perl 5.005_03 が標準で含まれているが、make world 時の
負担を減らす等の理由で、FreeBSD 5.x からは Perl 自体が標準では
入らなくなった。
ports/packages には 5.005 も 5.6.x も 5.8.x も用意されているので、
4.x だろうが 5.x だろうが必要なヴァージョンをインストールできる
(4.x に 5.8.x を入れたら、/usr/bin/perl が 5.005_03 、/usr/local/bin/perl
が 5.8.x になる) 。
612 :
デフォルトの名無しさん :03/12/16 04:39
>>601 業務系はほとんど同じだと思うけど。
CGIと業務系はレベル的には変わらないね。
どちらもただのデータ入出力のやり取りだからね。
ま、ゲームも同じような物だけど。
難しいプログラムなんて基本的にはない。
所詮プログラマーなんてそんな物。
面倒なプログラムはあるけど。
随分と自信家だこと
614 :
デフォルトの名無しさん :03/12/16 19:34
ハーイ、シツモーン! (/*・・)o globでファイルの拡張子を指定してファイル名取得ってできますよね。 my @list = glob("*.txt"); 同じ要領で指定した拡張子以外のファイル名って取得できます? 例えば、Aフォルダ内のtxtファイル以外のファイル名を取得。 どんぞよろしく。
grep { -f && !/.*\.txt$/ } glob "*"
616 :
デフォルトの名無しさん :03/12/16 20:35
そのまんま使ったらうまくできました。 ありがとうございました。 どうしてこれで取得できるのか調べねばφ(・・。)ゞ
今までずっとペリと読んでいて今更パールなんて読めません。 一体どうすればいいんでしょうか・・・
真珠と嫁。 国産のオブジェクト指向スクリプト言語は紅玉だ。
>>616 Schwartz変換と同じ。
知らなければ調べるよろし
>>616 my @list = glob("*");
my @not_txt;
foreach (@list){
if(-f){
if(!/*\.txt$/){
push @not_txt, $_;
 }
}
}
これで我慢しとけ
>>615 >>616 調べるためのヒント
1. grep { ブロック } リスト っていう関数があるはず。調べてみましょう。
2. -f ファイルテスト演算子というのものがあります。調べてみましょう。
3. /*\.txt$/ これを ! で否定しているわけですね。
4. && アンドです。両方とも成り立つときに真です。
>>618 _、_
( ,_ノ` ) n
 ̄ \ ( E)サンクス!!
フ /ヽ ヽ_//
真珠か、いー響きだ。
623 :
デフォルトの名無しさん :03/12/17 23:15
文字列を保存したファイルを開いて その文字列をランダムで表示させるプログラムってどうやるのでしょうか?
>>623 何がわからないのかはっきりさせろ。
1.ファイルの開き方が分からない
2.ランダム値の作り方が分からない
3.表示の仕方がわからない
625 :
デフォルトの名無しさん :03/12/18 01:06
ファイルを開いてからが分かりません。 どうやってファイルの中の文字をランダムで表示させるのか・・・。
626 :
デフォルトの名無しさん :03/12/18 01:24
ご教授願います。
http://www.police.pref.osaka.jp/topics/17.html こんな情勢によって、18未満の登録を受け付けないようにしたいのですが、
西暦と月日から計算して、年齢を割り出すCGIの為、上手く18未満へのエラ
ーを返す事が出来ません。
スクリプトは、
sub age {
my($b_year, $b_month, $b_mday) = @_;
local $_;
if ($b_year < 1000) { $b_year += 1900; }#ver4以前のデータを補正
local $_ = $year - $b_year;
if ($mon < $b_month) { $_--; }
else {
if ($mon == $b_month && $mday < $b_mday) { $_--; }
}
return $_;
}
とサブルーチンを組んであり、呼び出しは
print age($bY, $bM, $bD) . "歳"; のような感じです。
if (age($bY, $bM, $bD) => 18) { $errStr .= "18歳未満の方はご利用出来ません<br>"; }
のようにエラーを返したいのですが、「age($bY, $bM, $bD)」の仕組みがわかりません
ご教授願います。(#ver4以前のデータを補正は必要ないと思われます)
>>625 1と3は分かってて、2が分からないってことでいいんだよな?
randを調べてみそ。
>>608 どのレベルの話をしてるかわからんが、
以下のようなコードで想定通りの動作を得られた。
根本的な勘違いをしてないか?
use DBI;
$s = DBI->connect("dbi:Sybase:SYBASE", 'login', 'passwd');
$p = DBI->connect("dbi:Pg:中略", 'login', 'passwd');
print $p->selectrow_array("SELECT COUNT(*) FROM table1"), ": Pg\n";
print $s->selectrow_array("SELECT COUNT(*) FROM table2"), ": Syb\n";
1つめのエラーは、もらったはずのDBハンドルに 0 とか undef が入ってるんだろ?
2つめのは氏欄
人に説明しやすいソース出せ
Perlスレで PG とかいわれて、DBD::Pg のことかとオモタヨ
>>614 老婆心ながらアドバイス
シェルで使うような正規表現でglobbingしたいのでない限り
opendir readdir 使った方が軽いし融通も効く…と思うぞ
opendir($D, '.') || die;
@dir = sort grep(/pattern/, readdir($D));
perldoc File::Glob File::Find を見ておくのもよいかもしれん
>>626 何を助教授されたいか知らんが
この age ってサブルーチンは、引数の他にも
グローバル変数 $year $mon $mday が必要だろ?
それはセットされてるか?
# このサーバは日本国内にあるのが前提
($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime;
$year += 1900;
$mon++;
もし localtime などを使用して現在日時が得られているのなら、
与えられる引数(サブルーチン内の $b_year とか)は、
localtime のものと互換性があるか?
year は +1900 のゲタをかまさないといけないし
month は +1 のゲタをかまさないといけないワケだが
で、これがいちばん重要なんだが
・サブルーチン age を修正したいのか?
・与えられた生年月日から年齢を得る方法(あるいは18未満判定)を知りたいのか
どちらだ?
>>626 試行錯誤して動かせるレベルなので。。。
sub GetAge {
my($bY, $bM, $bD) = @_;
unless($bY && $$bM && $bD) {return '';}
if($bY =~ /[^0-9]/) {return '';}
if($bM =~ /[^0-9]/) {return '';}
if($bD =~ /[^0-9]/) {return '';}
if($bY < 1900 || $bY > 2023) {return '';}
if($bM < 1 || $bM > 12) {return '';}
if($bD < 1 || $bD > 31) {return '';}
my($s, $m, $h, $D, $M, $Y) = localtime(time);
my $age = $Y + 1900 - $bY;
if($M+1 < $bM || ($M+1 == $bM && $D < $bD) ) {
$age --;
}
return $age;
}
ここら辺なのだろうか?
「・与えられた生年月日から年齢を得えて18未満判定)をしたいのです」
んです、どうこをどう説明したらいいんでしう...
632 :
デフォルトの名無しさん :03/12/18 10:08
おそらく初歩質問。でも自分にとってはかなり問題。 質問させてください。 $list="111aaa222bbb333ggg<ここでいったん切る>9999vvvvgggg5555sss" って変数があっってそっから<ここでいったん切る>を目印に文字列を分割したい場合にどうすればよいのでしょうか? $mae="111aaa222bbb333ggg" $shirushi="<ここでいったん切る>" $ushiro="9999vvvvgggg5555sss" こんな感じで3パターンの変数を作りたいです。 よろしくおねがいします。
分割の目印になる文字列が一定ならsplitがお手軽だと思うけど $shirushi="<ここでいったん切る>"; $list="111aaa222bbb333ggg<ここでいったん切る>9999vvvvgggg5555sss"; ($mae,$ushiro) = split($shirushi,$list); print $mae."\n"; print $ushiro."\n";
Perl のソースコードを HTML 形式にフォーマットするモジュールありますか? やりたいのは Perl のソースコードを食べさせる Vim や Emacs みたいに =pod .. =cut や # 以降を淡色表示にしたり、 変数や定数、予約語や久美子み関数を違う色にタグ付けした HTML のコードを吐き出すの。 このすれのサポートページのコンテンツにと思っていたのだが、結構大変そう。 構文解析とか必要だろうし、なかったら Flex と Bison つかってでもやるしかない。
>>634 Emacsに読み込ませてface2htmlすれば?
>>634 Perlモジュールじゃないけど enscript ってプログラムがあるよ
>>635 VimユーザなのでVimにも相等の機能がないか調べたらありました。
:$VIMRUNTIME/syntax/2html.vim
でHTMLなコードを吐き出してくれるようです。
>>636 Vim/Emacs もいいけど、
こっちの方が呼び出しとか結果をとりこむのが簡単そうなので
こっちにします。
感謝ハムニダ
>>635 >>636
宿題なのです。 教えてチャンでごめんなさい。 このプログラムがどういう風に実行されてるか解読して来いといわれました。 お暇な方、いらっしゃいましたらお願いします。 sub search_p { my @key; $in{word} =~ s/( )+/ /g; $in{word} =~ s/\s+/ /g; $in{word} =~ s/^\s//g; if (!$in{new_reg} && !$in{word}) { &error("検索項目を入力して下さい。"); } if ($in{word}) { @key = split / /,$in{word}; } &header; &search_win; print "<br><br>\n"; print "<hr color=\"$body_text\" size=1 noshade>\n"; my ($path, $past, @hit);
foreach $path($log_path, $past_log_path) { if (!$in{chk_p} && ($path eq $past_log_path)) { last; } open(READ,$path) or &error('Log open error'); while (<READ>) { if (@hit >= $hit_max) { last; } if ($in{new_reg}) { my (undef,undef,undef,undef,undef,$time) = split /\t/; if ($now_time <= $time + ($new_limit * 60 * 60)) { my $w = $past . $_; push @hit, $w;
} next; } if ($in{chk_m}) { if (!/^\d+\t\d+\t0\t/) { next; } } my ($i, $ok, $ng); foreach $i(@key) { if (index($_, $i) < 0){ $ng = 1; }else{ $ok = 1; } } if ($in{select} eq "and"){ if ($ng){next;} }else{ if (!$ok){next;} } my $w = $past . $_; push @hit, $w; }
close (READ); $past = "past"; } my $cnt = @hit; if ($cnt == $hit_max) { $cnt = "<b>検索結果が $hit_max 件を超えたので中断されました。</b>"; } elsif (!$cnt) { $cnt = "何も見つかりませんでした。"; } else { $cnt .= " 件"; } print <<EOF;
<table border=0 cellpadding=2 cellspacing=0 width="100%"> <tr><td colspan=3> $cnt <hr color="$body_text" size=1 noshade> </td></tr> EOF foreach (@hit) { my ($get,$past_word); if (index($_, $past) == 0){ $past_word = '<font color="blue">[PAST]</font>'; $get .= "&past=1"; s/^$past//; } my ($no,$mno,$pno,$tred,$titl,$time,$name,$email,$url,$cmnt,$ipadr,$pwd) = split /\t/; my $date = &get_date($time); if ($email) { $name="<a href=\"mailto:$email\">$name</a>"; } ($cmnt) = split /<br>/, $cmnt; $cmnt .= "..."; $get .= "&$dm"; print <<EOF;
スレ汚しすみません。
>>639-643 プログラマ歴5年の俺様が解析するに、これは
「検索項目を入力させて、検索結果を表示するプログラム」
だな。うん
646 :
デフォルトの名無しさん :03/12/18 18:46
インターネットの匿名掲示板2ちゃんねるにて、殺人を予告するスレッドが立ちました。
以前にもこの人物は同様の行為をくりかえしており悪質、偏執的でかなり危険な状態にあります。
予告がされたURLはこちら↓
http://comic3.2ch.net/test/read.cgi/voice/1071634666/ 「年内に」と時刻を指定していることで、かなりひっぱくした状況にあると思います。予告されている対象は、声優の田村ゆかりさんであり、
彼女は年末にライブを行う予定があることから、脅迫罪とともにライブに対する威力業務妨害罪の適用も可能かと思います。
宿題は自分でやろうな
648 :
デフォルトの名無しさん :03/12/18 18:50
>627 ランダム関数を使うのは分かってるのですが どうやったら他のファイルの文字列を(ランダムで)表示させるのかが分かりません。
>>648 出来ない事を一度にやろうとするな
他のファイルを読み込む→配列に突っ込む→配列の要素をランダムで選ぶ→それを表示させる
651 :
デフォルトの名無しさん :03/12/18 19:38
>649 他のファイル@array(・・・・・・・・)から どうやって文字をランダムに表示させるんですか? open(F, txt) || die "表示不可"; のあとが分かりません。
>>651 配列に突っ込むがわからないということでつか?
653 :
デフォルトの名無しさん :03/12/18 20:50
別のファイルを読み込んだ後はどうするのか・・・分かりません
654 :
デフォルトの名無しさん :03/12/18 21:52
open(F, "kuji.txt") || die "can't open\n"; srand; $num= rand(@array); print "選ばれた文字は$numです\n"; close (F); これじゃ駄目なんですよ。当たり前なんでしょうが・・・ 分かりません。(((゚Д゚;)))) シクシクシクシク
>>639-643 プログラマ歴15年の俺が推測するに、
こういう風に実行されてるはずだ。
Perl 起動
↓
スクリプト読み込み
↓
構文解析
↓
コンパイル
↓
実行
>>654 「配列の要素をランダムで選ぶ」が分からないんでしょ?
もうちょっと質問する努力をしてくれ
print $array[rand(scalar @array)];
>>655 ごめんごめん 「配列に突っ込む」も分からないのか
つーか何にもわかってねーじゃねーかゴルァ
my @array = <F>;
甘やかし過ぎかな?
658 :
デフォルトの名無しさん :03/12/18 22:51
そうなんですよ。Perl致し方なくやってるもんで全然分からずに・・・ なんとかあやふやなモノが出来ました。有り難う御座いました。
win上での実行法で質問なんですー 核心部分を言うとperlスクリプトのファイルをダブルクリックで実行した時にDOS窓が開いて一瞬で閉じるのを防ぐ方法は無いでしょうか $val=<STDIN>やら引数無しsleepでも止まりませんでした・・・ 具体的にはスクリプトファイルへのショートカットをSendToフォルダに置いて、任意ファイルを「送る」からプログラムに投げたいのです んでその後パラメータを入力するって動作をさせたいのです
>>659 1) 「最小化して実行」
2) wperl.exe を使ってみる
質問なのですが、 ひまわりっていう日本語プログラム言語のページに書かれていたんですけど、 >PerlやRubyのようにバイトコードに変換してから実行すれば >速度面は改善されるだろう。 えっとperlてバイトコードに変換してから実行してたんですか?
Windows2000でActivePerl5.8つかってるんですが、 perlのbinフォルダにある、perl.exeとperl5.8.0.exeの違いって何ですか?
>>662 ファイル名のみが違う。中身は(たぶん)一緒。
いずれも、実行部本体である perl58.dll を呼び出している。
で、なぜ名前が違うものが用意されてるかというと
Perlバージョンに依存したものを実行する必要があるときのため。
てかCRCとったら同一でした・・・・ すません。
md5も一緒でした
unixだとハードリンクしてるだけなんだがな。
print "abc"; sleep(1); print "def"; sleep(5); print "ghi"; こう書いたら6秒止まってからabcdefghiと出ます。 abc(1秒止まって)def(5秒止まって)ghiと表示するにはどうすればいいでしょうか? なぜ上記ではダメなのかも教えていただけるとありがたいです。
$arr = [ ['', qw(a b c)], [qw(A 1-1 1-2 1-3)], [qw(B 2-1 2-2 2-3)], [qw(C 3-1 3-2 3-3)] ]; ↑のような配列を ↓のように変更したいのです。 $arr = [ ['', qw(A B C)], [qw(a 1-1 2-1 3-1)], [qw(b 1-2 2-2 3-2)], [qw(c 1-3 2-3 3-3)] ]; 一応考えてみたのですが、もっと良い方法がある、とかありましたら教えて頂けますでしょうか。 my $reverse_arr = []; my $n = ''; for ($n = 0; $n <= $#{ $arr }; $n++) { push, @{ $reverse_arr }, [ map { $arr->[$_]->[$n] } 0 .. $#{ $arr } ]; } $arr = $reverse_arr;
>>670 foreach my $array_ref (@$arr) {
foreach (@$array_ref) {
tr/a-zA-Z/A-Za-z/; # 小文字を大文字、大文字を小文字に変換
s/^(\d+)\-(\d+)$/$2-$1/; # ハイフン区切りの数字の前後入れ替え
}
}
# 結果の確認
print "@$_\n" for @$arr;
これでいいのかな?やりたいことと違うならもう少し詳しく説明よろ
>>671 申し訳ない。例が悪かったです。
$arr = [
['', qw(a b c d e)],
[qw(A あ い う え お)],
[qw(B か き く け こ)],
[qw(C さ し す せ そ)]
];
↓
$arr = [
['', qw(A B C)],
[qw(a あ か さ)],
[qw(b い き し)],
[qw(c う く す)],
[qw(d え け せ)],
[qw(e お こ そ)]
];
正式名称知りませんが、表の軸の入れ替え?をしたいのです。
一応自分の書いたコードでも動作しているのですが、他にスマートな方法があればお伺いしたいな、と。
行列の行と列を入れ替えるってことですね。
素直に書くとこんな感じ?素直な分、
>>670 さんのより多分早いと思う。
for (my $i=0; $i < scalar @{$arr}; ++$i){
for (my $j=$i; $j < scalar @{$arr->[0]}; ++$j){
($arr->[$j][$i], $arr->[$i][$j])=($arr->[$i][$j], $arr->[$j][$i]);
}
}
あ、だめだ
>>673 はn行n列の行列じゃないとうまく動かないや。
>>672 670のでいいんじゃ?
列を行にしてるんだよね
逆に行から列もできるけど行数x列数だけpushしまくりになるからめっちゃ遅いだろうな・・・
変換対応のテーブルを事前に作っておくか自動で作って置いて、変換の際はそそくさと済ませちゃうとか。 sin 計算が煩雑なのであらかじめ sin テーブルを作るみたいなノリで。@わりと古い脳内回路です(^-^;)
行列モジュール使っちゃダメか?
>>677 脳内杉
この案件だとそそくさも何もないだろw
質問です。 perl.exeとwperl.exeの違いは具体的に何なのでしょうか? Windowsだと.plファイルを関連付けするとDOS窓が起動しなくなるけど、 Linuxなんかでは違う動作なのでしょうか?
>>680 Subsystem=3(コンソール)
Subsystem=2(GUI)
の違い。具体的な違いについてはパス。
コンソールアプリでバイナリをつくると、デスクトップから
実行した際に、(コンソールを放棄しても)コンソールが現れてしまうし
GUIでバイナリ作ると、今度はコマンドラインから起動しても
start XXXX.exe と同じく実行ファイルが終了を待たずに detach されてしまう。
コンソール/GUI共用バイナリはとても作りづらいので、
用途によって perl.exe wperl.exe を使い分けるちうわけだ。
Perl/Tk なサンプルコードを書いて、コマンドプロンプトから
perl wperl それぞれで起動してみるとわかるんじゃないかな?
ちなみに Unix 系のバイナリでは、wperl に相当するバイナリは存在しないのが普通。
682 :
トッド若松 :03/12/21 01:24
16進数が文字列として処理されてしまうのですがいい方法ないですか? -----処理---------- $a="10:0x10"; @b=split(/:/,$a); print "$b[0]\n"; print "$b[1]\n"; -------結果------- 10 0x10 <--- ここを16にしたいのだが....
684 :
トッド若松 :03/12/21 01:55
>683 申し訳ないが、hexを使う場合、以下のように16進の判定が必要になります。 if($b[1]=~/^0x/){ $b[1]=hex($b[1]); # または、$b[1]=sprintf("%x",substr(b[1],2); } print "$b[1]\n"; 例が悪かったのですが、10進、16進どちらの形式が入力されているかが、あらかじめ分からない場合、上記のような判定分なしの解決策はないでしょうか。
>>682 先だって16進→10進変換行っておけ
$a =~ s/0x([0-9A-F]+)/hex($1)/egi;
(安全のためには、split で切り出してから変換した方がいいのだが
手を抜きたい場合は上記でおk)
686 :
デフォルトの名無しさん :03/12/21 21:25
ちょっと質問させてください。 あるファイルをバイナリとして読み込んで、 それに対応した画像を表示させようと思っています。 例えば「01 23 45 67 89 AB」という内容のファイルで 0〜F.gifのファイルで対応させています。 1バイトで画像二つ分になります。 大体うまくいくのですが、おそらく「00」があると 「0」として認識している感じです。 いろいろ対応をしたんですがことごとく失敗してます。 対処法を教えていただけませんか? 以下に現在の方法を簡単に書きます @data に1バイト分の数値データの配列が入っています。 (当然0から255までの数値のみ) foreach $a (@data){ $a = sprintf("%x", $a); } で、16進法に変換します for ($i=$start1 ; $i<= $end1 ; ++$i){ $dat = $dat . $data[$i]; } 文字列変数$datに指定範囲のデータを入れて 0〜Fのを画像タグに置換しています。
%02x
>>687 サン
サンクス!!!
$a = sprintf("%x", $a);
を意味を理解せず使ってたので…
精進いたします。
>>686 本題には関係ないが、
$a (と $b) は使わない方が良い
$dat = $dat . $data[$i]; は $dat .= $data[$i]; とも書ける
>689サン $a $bはここに書くために変えました。 元は他の変数名です。 $dat .= $data[$i]; こんなのあったのはなんとなく知ってましたが、 このプログラムをちゃちゃーっと書いていたので、 調べるのもなんなんで、安易にああしました。 こっちのほうがきれいですよね。 ご丁寧にありがとです。 $data[$i]をsprintf("%x", $a)にしたほうが 全然効率的だとしばらくして気が付いた…(苦笑
$aを使わないほうがいいのは暗黙的にある関数に使われていて 干渉するから…とかですか? ぐぐってみたけども'$a'がなかなかうまく引っかからないのね… >691 sprintf("%x", $a)じゃなくてsprintf("%02x", $data[$i])だった…
かなり旧型のWin98機でActivePerl5.8.1を使っているのですが、 モジュールをインストールする際に必要な C コンパイラで、手軽というか 容量が少なくてすむものはないでしょうか。 Borland C++ や Cygwin は、このマシンにはきつくて。
>>691 my $file = "\x00\x00\x00\x32\x5F\x0D\x0A\x23\x00\x00";
my $dat = substr join('', unpack 'H2' x length $file, $file), $start, $end - $start + 1;
>>693 LSI-C 86 試食版
でググるといいかも。。。
クククのクーソ。。。
perlをつかって2ちゃんねるに書き込みする事はできますか?
700 :
デフォルトの名無しさん :03/12/23 15:29
質問させてください。 簡単なチャットを作ったのですがどうしてもうまく動きません。 同じディレクトリにchat1.cgiとchat1.datとcgi-lib.plを置いています。 表示はできるのですが送信を押すとInternal Server Errorになります。 使用環境は自宅サーバーでApach1.3.29とActivePerl5.6です。 どなたかわかる人いましたらご教授おねがいします。
エスパー募集中です。未経験者歓迎。
/var/log/apache/ の下に error.log とかない? そこにヒントがあるかも知れないわね。。。 鯖が動いているプラットフォームは Windows かしら? だとしたら↑のディレクトリじゃないけど、 Apache が吐き出すエラーログをよく見るのよ。。。 クククのクーソ。。。
>>704 うわああああああああ!!
大感謝!!
うごきました!!!
>>705 何やってんだ。最低でもコンパイルエラー取り除いてから実行しろよ。
>>706 >>700 にも書いていたと思うけど、 perl -cw chat1.cgi やっても見つからないわよ。。。
クククのクーソ。。。
>>707 そりゃif文の中チェックしてないからだろ
へぇ、そうなんだ 初耳
>>708 if文は関係無い。
未定義の関数を呼び出す文があっても
-wc はエラーを出さないよ。
$ perl -wce "a();"
-e syntax OK
>>704-710 (´-`).。oO( 組込関数の冗長な括弧を書かなければ防げたね… )
712 :
デフォルトの名無しさん :03/12/23 22:59
上級者の方に質問ですが、 perlのコンパイル時に実行禁止の関数を設定できるオプションがあるようなのですが いくら探しても出てきません。 例えばexecやsystem,symlink関数を使わせないようにするには どうすればいいでしょうか?
クンクンこんなとこにまで出てくんなよ! …と思ったら葬式か。まあ、葬式だけは許してつかわす
>>681 お礼が遅くなってすみません。
半分くらい理解、あとは自分で調べます。
ありがとうございました!
gccのPerlとActivePerlって共存可能ですか? あと違いはありますか? ついでに皆さんのOSとインタプリタを教えてください。 print "Start ..."; # 重い処理 print "Done.\n"; と書くとprintされるものが\nまで溜め込まれるようで 「重い処理」が終わった後に表示されてしまい、意図したものと異なってしまいます。 print "Start ...\n"; # 重い処理 print "Done.\n"; と書くと思ったように表示されますが、 Start と Done を一行に表示させたい場合、 どうしたらいいですか?
あ、後ろの質問の解決方法がわかりました。 $| (use English;していれば $OUTPUT_AUTOFLUSHも可) に 0以外の値をセットすると、printとかwriteを実行するたびに 出力するんですね。 まだ試していませんが、これで多分 解決!
>>717 わたしは Cygwin の Perl が半分、もう半分は職場から自他草場に繋げて Linux の Perl ね。
バージョンは 5.8 系を。
クククのクーソ。。。
>>717 WinXP + ActivePerl + cygwin(Perl除く)ですが何か
>>717 cygwin 内で閉じてるときは cygwin perl
スタンドアロンのときは ActivePerl
使い分けてるな。W2k.
cygwin perl と ActivePerl の違いはクサる程ある。
>>717 例えばNT 系で chmod は鬼門だわ。。。
ククーン。。。
>>717 オレの環境ではActivePerl522ベースのjperlと
ActivePerl808が共存してるからできるんじゃないの。
一方を、例えばgccのperl.exeをgperlとかに変更すれば
いいとおもわれ。
文字列を四文字づつのリストに分解したいです。 例:"abcdefghijklmnop" ⇒ ("abcd", "efgh", "ijkl", "mnop") 一行くらいでスパッとやるイディオムをキボンヌ
日本で一番レベルが高いPerlコミュニティーってどこ?
>>727 巨大掲示板群「2ちゃんねる」のプログラム板「Perlについての質問箱」とか
WebProg板のPerl関連スレッドとかかしら。。。
クククのクーソ。。。
いつまで葬式やってんだよ
>>696 え、LSI-C 86 試食版でモジュールのコンパイルってできるのですか
どうもです試してみます
教えてください。 openで指定するファイル名に、ワイルドカードを使用することは可能でしょうか? 別システムから上がってくるログファイルの内容を読み込んでチェックしたいのですが、 目的のファイル名が前半部分しか特定できません(後半はランダムな文字列が上がってきます)。 ですので、例えば samplexxxxx.logというファイルの'sample'部分だけを指定し、samplexxxxx.logをオープンしたいのです。 イメージとしては、ワイルドカード使用のような方法があればと思います。 open (InFile1, "sample*.log") のような指定は可能でしょうか。また、なにか他に方法はないでしょうか……。 勉強不足だなーとは思うのですが、よろしくお願いします。
>>732 my @file = glob 'sample*.log';
for my $file (@file) {
open InFile1, '<' . $file or die $!;
...
>>732 open(FH, '/bin/cat /path/to/sample*.log |');
>>733 ,
>>734 すばやいご回答ありがとうございます!
早速試してみます。
ありがとうございましたー(礼)。
>>732 本当にそういう処理をしないといけないのかしら。。。
samplefoo.log と samplebar.log って二つのファイルがディレクトリ内にあったら、
どちらがオープンされるのか分からないわよ。。。
ただ単に「○●という処理がしたい」という前に、本当にそういう処理が必要なのか
考えてみたらどうかしら。。。
クククのクーソ。。。
一括処理したい時は普通にある
>>736 なにも前提条件ないので、処理の順番とかそういうものに
一切目をつぶった回答をしてみた。これで困るなら
質問者
>>732 からさらなる質問があろうと思ったので。
もっと手抜きするなら for (`/bin/cat /path/to/sample*.log`)
ちなみに俺は opendir 派。
UNIXに依存したコードってカコワルイ。
740 :
デフォルトの名無しさん :03/12/26 19:52
perlってパースした後のデータを、ファイルに書き出すような機能ってあるの? またそれを読み込んだりして、コンパイルのオーバーヘッドを回避したり。
>>740 > perlってパースした後のデータを、ファイルに書き出すような機能ってあるの?
何の事言ってるか知らんが、serialize の事なら相当の機能はある。
> コンパイルのオーバーヘッドを回避したり。
(´Д`)?
perl2exe
ActivePerlでImage::Magick 5.26を使ってbmpをjpgに変換するスクリプトを作ってます Setメソッドでqualityパラメータを渡せば圧縮品質を決めれるらしいのですが qualityの値を指定してもしなくても、生成されるJPEGファイルのサイズが同じで指定が効いてないようです こりゃ仕様?バグ?未実装? 何か知ってる人いたら助けてくらさいー
746 :
デフォルトの名無しさん :03/12/28 01:17
初学者です。 違う書き方がいくらでもできてしまうPerlに萎え萎え。 推奨コード、非推奨コードみたいなのをまとめたドキュメントってどっかに転がってないものでしょうか。 ひととおりの書き方を覚えて、その中から好きな書き方を選ぶのってなんだか手間だよ。
>>746 PerlやめてJavaでもやれば?
初学者ってことは仕事でやってんじゃないんだろ?
萎えるようなもんわざわざやることはない。
書いてくウチにだんだん収斂しテクに一票 いっぺん中〜大規模なもの書いてみれば スタイル身に付くよ 人のコードは参考にならないことが多い(むしろ害になることも)
CGIにはろくなコードはないので、絶対に参考にしちゃだめです。 むしろSchemeから学ぶことが多いです。
$val = 'foo' if not $val; $val ||= 'foo'; $val = $val ? $val : 'foo'; $val !~ /.+/s and $val = 'foo'; perlマンセーw
if (! $var) { $var = 'foo'; } が一番イイと思う
ブロックに出入りするより短絡論理演算が速い現実
くだらないが素直にベンチ執ってみる #!/usr/bin/perl use strict; use Benchmark; timethese(1000000,{ 1=>q{ my $val=''; $val = 'foo' if not $val; }, 2=>q{ my $val=''; $val ||= 'foo'; }, 3=>q{ my $val=''; $val = $val ? $val : 'foo'; }, 4=>q{ my $val=''; $val !~ /.+/s and $val = 'foo'; } }) Benchmark: timing 1000000 iterations of 1, 2, 3, 4... 1: 0 wallclock secs ( 1.09 usr + 0.00 sys = 1.09 CPU) @ 916590.28/s (n=1000000) 2: 1 wallclock secs ( 0.85 usr + 0.00 sys = 0.85 CPU) @ 1175088.13/s (n=1000000) 3: 0 wallclock secs ( 1.02 usr + 0.00 sys = 1.02 CPU) @ 978473.58/s (n=1000000) 4: 1 wallclock secs ( 1.08 usr + 0.00 sys = 1.08 CPU) @ 924214.42/s (n=1000000) @Pen3 ActivePerl5.6.1ですた
うーむ。俺の好みの順番と一致してるのには驚いた。
>>755 5 => q{
my $val = '';
if (! $val) {
$val = 'foo';
}
}
2.4.23 i686 GNU/Linux, Perl 5.8.2 で同じくベンチ。
環境によって結構変わるみたいですな。
1: 2 wallclock secs ( 2.02 usr + 0.00 sys = 2.02 CPU) @ 1485148.51/s (n=3000000)
2: 3 wallclock secs ( 1.96 usr + 0.00 sys = 1.96 CPU) @ 1530612.24/s (n=3000000)
3: 2 wallclock secs ( 1.93 usr + 0.00 sys = 1.93 CPU) @ 1554404.15/s (n=3000000)
4: 3 wallclock secs ( 2.25 usr + 0.00 sys = 2.25 CPU) @ 1333333.33/s (n=3000000)
5: 2 wallclock secs ( 2.04 usr + 0.00 sys = 2.04 CPU) @ 1470588.24/s (n=3000000)
3と4のコードはあくまで
>>746 に対する遊びなんで本気になさらず・・・
759 :
デフォルトの名無しさん :03/12/28 05:06
初心者ですが質問させてください たとえば モナ1歳東京 ギコ2歳大阪 シィ3歳アメリカ これがdata.datの中に入ってまして これを出力させたいのですが #!/usr/local/bin/perl $filename = "data3.txt"; open(FILE, $filename); $v = <FILE>; close (FILE); @allbody = split(/\n/,$v); for ($i = 0; $i < @allbody; $i++){ print "$allbody[$i]"; } exit; これでうまく出力できません 改行ごとに1つの文字にしてそれをタブで区切って出力したいのですが、どなたかご教授お願いします 初心者ですみません
モナ(タブが入ります)1歳(タブが入ります)東京
$filename = "data3.txt";←間違い $filename = "data.dat";です
$filename = "data.dat"; -f $filename or error('No such data file.'); local *FILE; open FILE, '<' . $filename or error('Cannot open data file.'); @allbody = <FILE>; close FILE; print "$allbody[$_]" for 0..$#allbody ;
> 改行ごとに1つの文字にしてそれをタブで区切って出力したい これがよくわからんなぁ。 元データのタブ → 削除 元データの改行 → タブ つーことなんかねぇ。 ブラウザに出力するなら print "Content-type: うんたらかんたら\n\n"; も足りんし。
>763 ありがとうございます! でもなぜ #!/usr/local/bin/perl $filename = "data.dat"; open(FILE, $filename); $v = <FILE>; close (FILE); @allbody = split(/\n/,$v); for ($i = 0; $i < @allbody; $i++){ print "$allbody[$i]"; } exit; これではだめなのでしょうか…
/\n/
あえて元のスクリプトを活かすんだったら undef $/; かねぇ。 とりあえず、$v = <FILE>; で一行しか読んでないだろ。 ただ、やりたいことは、 $filename = "data.dat"; open(FILE, "<$filename") || die "$filename: $!"; while (<FILE>) { chomp; print; } (動作未確認) で済みそうなんだが。
>766>767 ありがとうございます! ちょっと難しいので勉強して出直してきます!
769 :
デフォルトの名無しさん :03/12/28 09:01
>>747 ちょっとしたファイル操作で一発プログラムを書くのに便利そうなので勉強してます。
萎え萎えって書いたけど、Perlの泥臭ささはひとつの憧れでもあります。
工事現場で汗まみれになって働いてる男たちのある種のかっこよさと似ていますね。
>>748 ありがとうございました。
既出だったとはすいませんでした。
教えていただいたURLたいへん参考になりました。
EffectivePerlもそのうち買ってみます。
>>749 やっぱり書いていくうちに自然におぼえていくってのがセオリーなんですね。
人のコード読むためには必要なのかなあといろんな書き方覚えているところですが、
自分でどんどん組んでいったほうが意外と早道なのかもですね。
>>750 CGIのコードが糞ってのは驚きです。
いちばんPerlが普及している分野なのに!
schemeってそんなにいいんですか?
schemeのコードがそのままPerlでも動くんだったら勉強してみようかな・・・。
>>751-758 いろんな書き方の勉強になりました。
770 :
デフォルトの名無しさん :03/12/28 09:33
>>769 CGIはPerlを学ぶ参考にならんよ。
CGIは、モジュール読み込みのオーバーヘッドを嫌悪し、
関数呼び出しのオーバーヘッドを嫌って書かれる。
既に存在するモジュールを使わずに車輪の再発明を繰り返し、
コピペし、インライン展開し、UNIX依存のコードを書いて。
0.01秒の実行速度向上のために、スクリプトをプリプロセッサに通し、
本体を__END__以下に移し、分割し、dumpし、コンパイルする。
少なくともそこにPerl本来の美しさは無いよ。
Effective Perl嫁
初心者ですがまた質問させてください! 皆さんの協力で何とかここまでたどり着けたのですがこれを名前順や年齢順にソートするにはどうやったらいいのでしょうか #!/usr/local/bin/perl $filename = "data.dat"; print <<"EOM"; <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2//EN"> <HTML> <HEAD> <TITLE></TITLE> </HEAD> <BODY bgcolor="000000" text="ffffff"> <CENTER> <TABLE border="2"> EOM open(FILE, $filename); @allbody = <FILE>; close (FILE); foreach $line (@allbody){ ($name, $nenrei, $jyusho) = split(/\t/, $line); print "<TR><TD>$name</TD><TD>$nenrei</TD><TD>$jyusho</TD></TR>"; } print <<"EOM"; </TABLE> </BODY> </HTML> EOM exit; ご教授おねがいしますm(_ _)m #掲示板の都合上改行は避けています
>>772 シュワルツ変換でググれ
あとラクダ本持ってるんならどこかに書いてある
どこかにsortを入れて簡単にちょちょいとできないものでしょうか
$filename = "sort data.dat|"; にすれ。 年齢順なら "sort +1 data.dat|" な。
>>769 > 工事現場で汗まみれになって働いてる男たちのある種のかっこよさと似ていますね
似てね〜
> CGIのコードが糞ってのは驚きです
あぁ、こっちなら似てるかもね。
>>770 それもあるかもしれないけど、CGI の場合、
1. いろんな人がイイカゲンな (中途半端な) 知識で「CGI のつくりかた」みたいなのを書いていて、
2. 初心者がそれを鵜呑みにしちゃって、汚ない (Perl を理解せずに書いた) コードが氾濫、
3. そして、Perl を理解したつもりになって 1. に戻る
ってのもあると思う。
いや、もちろんちゃんと書かれたものや、綺麗なコードもありますよ (たぶん)。
非常に稀だけど。
ゴメン
>>776 >> CGIのコードが糞ってのは驚きです
> あぁ、こっちなら似てるかもね。
「ある種のかっこよさ」 は CGI にもありません。当然。
>>776 諸悪の根源は
KENTとかレスキューとかか・・・
>>770 の言うようにCGIはべた書きの方が速い。
真のPerlerは、そのべた書きのプログラムを
しこしこ手で書くのではなくて、べた書きのプログラムを
「生成する」プログラムを書く。2,3のCGIなら
手で書いた方が作業効率いいけど。
Perlのコードの綺麗さに関してはそれほど天井高くないよーな気が
>>779 レスキューはトップページ見るだけでコードがどんなか伺い知れますねw
>工事現場で汗まみれになって働いてる男たちのある種のかっこよさと似ていますね。 激しくワロタ(w
>>779 KENT ってのは知らなかったので今ちらっとコード見てみたんだけど、
ガクガクブルブルですた…
ひぃいいいいー
レスキューの方のコードはかなり昔に見たけど、おかげで最初から自分で書く決心がつきました (w
自動生成されたhtmlを手本にhtmlを手書きするようなもんだな
見よう見まねで書かれたHTMLを見て、それで勉強するようなものかも 経験的に Perlを知ってるヤシのCGI>>>>>>>>>>>>>>CGIしかしらんヤシのウンコPerlコード 今はUnixでもWindowsでもPerlナシじゃ生きてけない体だがな さいきんmod_perlマンセー
で、手本になるPerlのコードはどこに転がってんの?
>>786 CPANから、良さげなコードを探す
ハズレクジを引かないようにな
>>772 sub by_name {
(split /\t/,$a)[0] cmp (split /\t/, $b)[0]
}
sub by_age {
(split /\t/,$a)[1] <=> (split /\t/, $b)[1]
}
こういうのをつくっておいて、名前でソートしたければ
foreach $line ( sort by_name @allbody){ ............
ただ毎回splitするのは効率が悪いので
>>773 さんが
教えてくれたシュワルツ変換してみる。
sub sort_by_name {
map { $_->[0] }
sort { $a->[1] cmp $b->[1] }
map{ [$_, (split /\t/)[0] ] }
$_[0];
}
でも、ブラウザに出力するのなら板違いじゃないか?
あ、間違えてた。 sort_by_name()の最後の行がスカラーになってるけど、 配列(@_ や @$_[0] とか)にしないとだめですね。
791 :
デフォルトの名無しさん :03/12/28 22:05
今月号のハッカージャパンにWin32::GUIを使った 貴重なPerlスクリプトのソースが載ってる。 PerlでPerl/TKよりカッコイイGUIプログラムを作りたい香具師は必見でしょ。
#Win32::GUIの動作サンプル #モジュールの定義 use Win32::GUI; #マスターとなる窓の定義 style はWin32API参照 my $Window = new Win32::GUI::Window( -name => "Window", -title => "登録するURLの名称をいれて下さい", -style => WS_CAPTION | WS_SYSMENU, -width => 600, -height => 64, ); $Window->Show(); #入力ボックスの定義 $Textfield2 = $Window->AddTextfield( -name => "Textfield2", -left => 5, -top => 5, -text => $meg, -width => 580, -height => 22, );
#よく分からんが改行でボタンが押されるようになる設定 $Window->{-dialogui} = 1; #隠しボタンの定義 $Button = $Window->AddButton( -name => "Simple", -left => 600, -top => 5, -text => "", -tabstop => 1, -ok => 1, -style => hidden, ); #フォーカスの固定化 $Textfield2->SetFocus(); Win32::GUI::Dialog(); #ここのボタンをクリックした時の処理を書く sub Simple_Click { exit; } #ここに終了した時の処理を書く sub Window_Terminate { exit; }
ハッカージャパンのサンプルソースをそのまま転載してみました。 WindowsXP、ActivePerl5.8.0、Win32::GUI(Version: 0.0.558) で動作確認済みです。
Schwartz変換よりGuttman-Rosler変換の方が速いと言われている。 my @allbody = ( "ギコ\t2\t大阪", "モナ\t101\t東京", "シィ\t31\tアメリカ", ); #for (sort {$a cmp $b} map {sprintf"%-20s\t%s", (split /\t/)[0], $_ } @allbody) { #名前でソート、名前の最大長に注意 for (sort {$a cmp $b} map {sprintf"%03d\t%s", (split /\t/)[1], $_ } @allbody) {#年齢でソート my ($check, $name, $nenrei, $jyusho) = split /\t/; print "($name, $nenrei, $jyusho)\n"; }
よーし。パパ、シャチ泳ぎしちゃうぞー。 @sorted_by_name = sort { ($m{$a} ||= (split /\t/, $a)[0]) cmp ($m{$b} ||= (split /\t/, $b)[0]) } @allbody;
最近、各種キャリアの契約台数が拮抗して、EZwebに関する不具合が多くなりました 一部のEZweb(UP.Browser)では、対処したとしても新機種や固有の機種での不具合 があるようですが、それを解消するような関連するスレやサイトを教えてください。
>>798 EZwebはDNSのキャッシュ残しすぎてるから
mod_perl使ってるけどキャッシュの
調整が出来ないサイトそのままのような感じだね。
回避するには日時でもなんでもいいからURLに一つパラメータ作ればいい。
>>799 ありがとうございます、参考になりました。
最近、3キャリア対応のスクリプトを配布しているサイトが少なくなりましたが
どこかいいサイトないですかねー??
>>798-800 全然perlに関係ない。
プログラムの書きかたやアルゴリズムの質問してください。
list変数を扱う関数で、popは末尾から要素を取り除き、shiftは先頭から要素を取り除きますが、 任意の添え字の値を取り除き、それ以後の値を前に詰めるにはどうしたら良いでしょうか? 今書きながら思いついたのは以下の処理ですが、これは馬鹿でしょうか?(&全く動作確認してません) $soeji = 3; # <- 任意の番号 $kazoeru = 0 # <- 数える用 @list_2 = grep {$soeji != $kazoeru++;} @list; やはり全部ループ回すしかないのでしょうか? なにか良い方法をご存知の方はご教授下さい。
>>797 持ってます
内容は題名どうり主にフィルタとしてのPerlの書き方中心
関連して多段リファレンスでメモリ上でのデータの保持の仕方とか
後半HTML、XMLのパースもあるけどあくまでモジュールの使用例を示す程度
ソートについては9ページだけ
全体的に難しいことは書いてないし、浅く広く的な構成だから立ち読みで済むなら立ち読みで済ませたい感じ
ラクダ本→(effective|クックブック)と進んだ人ならわざわざ買う必要ないかも
@array=@array[(0..$#array)から$soejiを抜いた部分集合]; みたいなことってできないのかな。
>>804 ありがとう。その関数初めて知ったよ。
ちょっと嬉しいw。
しかし値を一つ抹消させるにしてはおおげさな関数だなぁ。。
その関数、知らなくてベソ掻いてたのダーレ?
>>803 ありがとう。すごく参考になりました。
ちなみに私は ラクダ本→実用Perlプログラミング と進みました。
(時期的には「実用」はラクダ本のかなり後だけど)
そういえば effective もクックブックも持ってないな。
我ながら変な本の選び方かも… (w
>>808 それ便利そうなんですよね。
でもそれ用のモジュールが必要なんでしたっけ?
>>810 配布してるアーカイブにインストール用のバッチファイルがあるからさくっとインスコできる
Win32::API、Win32::GUIはもともとこれらを使うコードを自動生成するようなツールだから当然必須
>>809 > ちなみに私は ラクダ本→実用Perlプログラミング と進みました。
なら、次はDamian ConwayのObject Oriented Perlなんぞはいかが?
邦訳もあるようだ。
ちなみに、「Perl データマンジング」は図書館に買わせて読んだ。
perlで色々なデータをどういうモジュールで取り扱うか悩む初心者には
よい本。
Schwartz変換よりGuttman-Rosler変換の方が速いのはよく考えてみれば
当たり前だな。
813 :
デフォルトの名無しさん :03/12/29 22:36
「続・初めてのPerl Perlオブジェクト、リファレンス、モジュール」 っての今日買ったYO! 良いぞ。これ。 リファレンスの基礎とか、オブジェクト指向とか、 CPANへのモジュール登録とか、脱初心者の痒いところに手が届いてる。
windows用のActivePerlでPerl/tkみたいなguiプログラミングできるんでしょうか?
>815 そのものがあるんですね。 まだ詳しくはわかってませんが ありがとうございました。
817 :
デフォルトの名無しさん :03/12/31 14:22
a.plでb.plとc.plをrequireしてて、 b.plでもc.plをrequireしてる場合、 c.plを2度呼び出していると言うことになるのでしょうか?
>>817 質問する前に自分で実験してみたらどうかしら。。。
a.pl ---
require "b.pl";
require "c.pl";
print "A\n";
b.pl ---
require "c.pl";
print "B\n";
c.pl ---
print "C\n";
$perl a.pl
C
B
A
$
結論から言うと、c.pl は1回だけ呼ばれたみたいよ。。。
これは version 5.8.0 の場合の実験結果だから4, 5, 5.6の場合は
保証できないわよ。。。
クククのクーソ。。。
819 :
ぼるじょあ ◆yBEncckFOU :03/12/31 15:14
>>817 (・3・) エェー
requireは一度しか読み込みを行わない関数だYO!
perldocにも書かれてるから間違い無いYO!
そうだよなぁ。。。 毎回読み込ませるようにしたいときは、use lib と no lib かな?
>>820 perldoc -f requireのサンプルを見て
allways_requireを実装しするとか(遅
>>820 perldoc -f do
ラクダ本の関数の章読んだことねぇのか?
なぁるほ「ど」(悪寒)
>>822 > ラクダ本の関数の章読んだことねぇのか?
知人に貸与したところ知人もろとも消えましたから(哀)
やはり手元に置いておくべきだよなぁブツクサ
>>818 なるほど、そのようにして調べるべきでした。
ありがとうございます。
超初心者なのですが質問させてください モナ:1歳:東京 ギコ:3歳:大阪 シィ:4歳:アメリカ このデータが入ったファイルを開き open(FILE, $filename); @all = <FILE>; というように@allに代入し、それを年齢順にソートするにはどのようにやるのでしょうか ちなみに @all = sort @all;では、名前順になってしまい、どうやってソートしていいのかわかりません 初心者名質問ですみませんがご教授よろしくおねがいします。
sort { ((split /:/, $a)[1] =~ /^(\d+)/)[0] <=> ((split /:/, $b)[1] =~ /^(\d+)/)[0] } @all; で、動かなかった。。。鬱。
>>827 sort のなかで split を呼び出すと非効率的よ。。。
@all = map {$_->[0]} sort { $a->[1] <=> $b->[1] } map { [ $_, (split /:/, $_) ] } @all;
眠くて実験する気力がないから匿名で投稿するわ。。。
クククのクーソ。。。
>827 >829 ありがとうございます。 でも、そのままコピペでやったのですがまったくソートされず そのまま出力されてしまいました。。
>>830 年の始めくらい、ちっとは理解する努力しろよ。
>>829 $a->[1] <=> $b->[1]
は 1 → 2 じゃないと意図したように動かん罠。
>>830 KENTレベルにして欲しかったら、そう言ってね。
@data = map{ $_->[ 1 ] } sort { $a->[ 0 ] <=> $b->[ 0 ] } map { [ m/:(\d+)歳/ , $_ ] } @data;
use strict; my @all = <DATA>; my @sorted = map{substr($_, 3)}sort map{sprintf"%03d%s",m!:(\d+)歳!,$_} @all; for (@sorted) {print} __END__ モナ:1歳:東京 ギコ:3歳:大阪 シィ:4歳:アメリカ
なんか話題がループしてるなぁ(w
last;
このスレで質問するやつは学習能力ないね って言われてもしかたないなw
>>837 このスレで回答する香具師も習能力ないね
サルのひとつ覚えのシュワルツ変換はヤメレ
839 :
デフォルトの名無しさん :04/01/02 18:24
>>838 学習能力あるとどういう風にコード書くの?
>827>829 ありがとう! そして最大のヒントをくださった831さん! ありがとうございました! ばっちりうごきましたです!
初心者ですが、何度も質問させていただき何度も偉大な回答いただきてありがとうございます。 これが最後の質問なのですが、お願いしますです。 モナ:1歳:東京 こういったデータが20件あって、それを5件ずつ表示させ、 なおかつ次のページへのリンクを作りたいのです(掲示板でよくあるやつです) それを先ほど教えていただいた年齢順でソートさせてから5件ずつ表示させるには どのようにやるのでしょうか ご教授よろしくおねがいします。
@array=qw(k u s o s u r e); @goken=@array[0-4];#←最大のヒント! print "@goken"; これでkusosまで表示されるぞ! あとは君の頭次第だ!
844 :
デフォルトの名無しさん :04/01/03 09:26
>842 何番まで表示したかとう言う数字をリンクの中に入れればOK。 後はWEBプログラミング板に行ってください。
845 :
デフォルトの名無しさん :04/01/03 15:27
馬鹿ばっか
>>842 >>1 読め!
板違いだっていうことがわかるだろ?
あんたのやろうとしている事は、Webプログラミングなの。
ここはム板。
よーし、お年玉でクックブック買っちゃうぞ〜 ナンツッテ
俺は今日、「初めてのPerl」 と 「続・初めてのPerl」 を買ってきたよ。 良質の睡眠薬だわ、これ。
>>843 >>844 ありがとうございます。
違うやり方でしたが苦戦した結果なんとかうまくできました。
>>848 クックブックは、1ページから全部の例題をやってみたら究極のPerlハッカーになれるわよ。。。
わたしのオフィスにも一冊おいてあるし、トイレでウ○チするときもお風呂にはいるときも持っていくし。
クククのクーソ。。。
>>850 クックブックはそこまで深くないだろ
お前本当に読んでるのか?
ミンキーモモ?
854 :
デフォルトの名無しさん :04/01/05 18:28
perlをACTIVEPERLでPCで動かしているのだけど、 while(1){ } で無限ループにさせて、これをキー入力で停止&再開させたいのだけどどうすればイイのエロイ人!
856 :
デフォルトの名無しさん :04/01/05 23:01
857 :
デフォルトの名無しさん :04/01/05 23:12
書籍ではクックブックってやつが最高レベルなんでしょうか?
859 :
デフォルトの名無しさん :04/01/06 01:13
>>857 さーんくすー
■が点滅してるから止まってないと思ったけど、実際は止まってたよ
ありがおおおおおおおおおおお
でもわかりにくいから一時停止とか表示できないものかね
>>859 そーんな時は愛しのPerlちゃんに、アイから始まる
シグナルをおくっちゃえ!
きっと振り向いてくれるよ!がんばってね。
861 :
デフォルトの名無しさん :04/01/06 05:34
862 :
デフォルトの名無しさん :04/01/06 07:59
>>858 実用Perlプログラミングなども高度なことが書いてありますよ?
別名、黒豹本。
>>795 いまさらだけど、これって GR 変換?
GR 変換って pack を使って sort の比較部分 (
>>795 だと {$a cmp $b}) を
書かなくてすむようにする、と理解したんだけど、漏れの理解が間違ってる?
質問なのですが、BSDのkqueueをperlで使いたくてコードを書こうと思ったのですが XSかInline Cかで悩んでいます。 やはりXSの方が早いのでしょうか?(それとももうすでにモジュールがあったり?) 実験されたことのある方、よろしくお願いいたします。
>>865 関係ないですけど、今後XSは廃止になってInline系で統一されるんだとか。
嘘だったらゴメン。
>>865 syscallっていう手もある。って優香、これが一番手っ取りはやいと
思うけどな。どれを使うにしろ引数の構造体のpack unpackが(ry
やっぱり重要なサブルーチンなんかをInlineを使って作ると 激速になるんでしょうか? もしかして2chのCGIが一部Cで書かれているというのはInline::Cを使ってる?
>>868 read.cgi が C
しかもべたべたのBasicが如きC
CGIはべったべたに書くのが一番速い。 関数なんて呼び出す必要すらない。 ただのバッチ処理だから。
>>869 やっぱCで書いてるんだ。ちなみにread.cgiをうまいことサブルーチン化して
Perl+Inline::Cにして作り直したら、同じようなパフォーマンスでるものですかね?
872 :
デフォルトの名無しさん :04/01/07 20:53
ActivePerlでcommandがめん出るじゃないですか あれでメッセージの表示の時に waite 10秒 ↑ここをカウントダウンできますか? sleepさせてるときに残りの時間を出したいのだけど、そのまま出すとログが流れで逆にみにくいので。
>>872 for (0..10) {
print "$_\r";
sleep 1;
}
876 :
デフォルトの名無しさん :04/01/07 21:39
うわ痛て
877 :
デフォルトの名無しさん :04/01/07 21:51
>>873 >>874 >>875 ありがとうございます。
while (1) {
$waittime=100;
for (0..10) {
print $waittime;
sleep 1;
print "\r";
}
}
ところが
>>874 さんので表示されなかったので、↑のようにしてみたのですが、
これでもなにも表示されないです。ググって見たのですが、
秒を表示して、1秒舞ってそれを\rで消して、っていうしょりなのでしょうか?
>>877 $waitsec = 10;
$progress=1;
for(1..$waitsec){
local $|=1;
sleep 1;
printf "[%-${waitsec}s] %3d%", "#" x $progress, $progress/$waitsec*100;
if ($progress < $waitsec){
print "\r";
} else {
print "わいてー!\n";
}
$progress++;
}
879 :
デフォルトの名無しさん :04/01/07 22:58
>>878 ありがとう〜
メーターみたいなのまで付けてくれたのですね。
ありがとうございます。
こういうのほしかったのです。
>>866 情報サンクスです。
>>867 たしかInlineやXSだとpackしなかった気がします。型変換はしていた気がしますが。。。
とりあえず、Inlineで書いてみます。
ありがとうございました。
一時期Perl6の話題で持ちきりだったけど今どうなってんだろうねぇ。
>>881 新しいPerlを欲しがってる人って実はいないんじゃないの?
>>883 何かおかしいか?
名前からして「作者が良く使う関数をまとめたモジュールを公開してみた」って感じだが、
そんなモジュールよくあるだろ。
むしろ
・多少は使える関数群
・コーディング作法は良い
という点から、評価はできるぞ
>>882 今のperlで不満ないよなw。
今後のバージョンアップ予定もプラグマとか、スレッドとか、
もっとちゃんとexeにコンパイル出来るとか、そーゆー細部系しかなかった記憶な予感。
Perl6にどうしてもなじめない人の為にInline::Perl5とか出る予感。
ここ見て初めてInline::Cなんてものがあるのを知った。 楽ちんすぎて涙がうるうるしてしまった。
>>887 Inline系モジュールっていくらPerlが何でもありでも
ここまでやる?って感じだよね。
誰かWin32::API::Callback使ったことある人いる? 使ってみたんだが、アレ 一回コールバック返すと満足してコールバック消滅しないか? まだ実験段階だからしょうがないのかなぁ・・・
>>878 でメーターと%を2行に分けて表示したいんですがどうなおせばいいですか?
Inline::Rubyはありますか?
おお、使えそう
Inline祭りの会場はこちらですか?
質問です。データを A,B,C,D,E F,G,H,I,J K,L,M,N,O ... のような形で持っているとして、各行の3番目の部分(C,H,M)を別な文字列で 置換したいと思います。 普通にコードを書けば処理できるんですが、Perlのパワフルさを活用したい です。どのようなコードを書けばいいのでしょうか? なお、A、B、C...の部分には文字列が入り、1文字とは限りません。 よろしくおねがいします。
久しぶりなもので、sageミスです。 すみません。
>>896 置換するものは固定?なら
perl -F, -nae "$F[2] = '...'; print join ',', @F" < 1.txt > 2.txt
って感じかな?
あ、↑はWindowsのシェルね。
Windowsのシェルってエクスプローラの事だろ? 違った?
コマンドラインって言えばよかろーもん
>>896 別な文字ってのはどう与えられるのかワカランが
open 略
while(<DATA>){
my @item=split/,/;
$item[2]=$subhash{$item[2]};#例えば変換テーブルを用意してるとして
略
}
ダサいかなぁ?
>>889 ハッカージャパン2003年5月号を購入しなさい。
903 :
デフォルトの名無しさん :04/01/10 23:10
こんばんわ。ちょっと質問させて下さい。 モジュールの勉強してるのですが、以下のように書いたモジュールを呼ぶと Line.pm did not return a true value at ./main line 3. BEGIN failed--compilation aborted at ./main line 3. と表示されてうまくいきません。use で読み込んだ時点で何に失敗してるのでしょうか? #------------------- main の関数 #!/usr/bin/perl use Line; my($i,$j,$k,$r); $string = <STDIN>; chomp($string); ($i,$j,$k) = split(/\s+/, $string); $r = Line::new($i,$j,$k); print(" $r->{name}\n"); #------------------- モジュール Line.pm package Line; sub new { my($name,$start,$end)=@_; my $r_line = { "name" => $name, "start" => $start, "end" => $end }; return $r_line; }
>>903 Line.pm did not return a true value
日本語に訳してご覧。
Line.pmの最後に1;
>>904 迅速なアドバイスありがとうございます。
>Line.pm did not return a true value
>日本語に訳してご覧。
Line.pmは真を返しませんでした。
あぁ辱かしい。以後気をつけます。
どうもありがとうございました。
Perl はいったいどこに向かって進んでるんでしょうか
907 :
デフォルトの名無しさん :04/01/11 00:27
open OUTFILE, "> 〜〜〜"; これって前の内容を消す出力用ですよね? for文を使って10回くらい処理を繰り返したいのですが, その繰り返す度に内容を書き換えるやり方ってどうやるんでしょうか?
お前さんの言ってることが良く分からんが open 10回書く close と書け (open 書く close) x10 じゃ最後の物しか書かれない もしくは open FILE ">>hoge"; を調べれ
>>908 >(open 書く close) x10 じゃ最後の物しか書かれない
これでした!最後の物だけ欲しかったんです.
ありがとうございました!
(゜д゜)ポカーン
最後のものだけ書けばいいのに
912 :
デフォルトの名無しさん :04/01/11 17:32
キューにジョブを5000個ため、3つのスレッドでそれを処理することを試みます。 しかしこれを実行したところ % ./ithread.pl T1:0 T1:1 ........................ T1:4998 T1:4999 T1 joined . のように途中で処理が止まってしまいまつ。どうしてなんでしょうか? アフォにでもわかるようにおしえてくださいな。
///////////ソースです////////// my $q = new Thread::Queue; &main(); sub main { my $cnt = 0; while ($cnt != 5000){ $q->enqueue($cnt); ++$cnt; } my $thread1 = threads->create(\&threadFunc, "T1"); my $thread2 = threads->create(\&threadFunc, "T2"); my $thread3 = threads->create(\&threadFunc, "T3"); $thread1->join; print "T1 joined .\n"; $thread2->join; print "T2 joined .\n"; $thread3->join; print "T3 joined .\n"; } sub threadFunc { my $num; my ($tName) = @_; while (defined($num= $q->dequeue_nb)) { print "$tName:$num\n"; } }
914 :
デフォルトの名無しさん :04/01/11 17:33
URLの拡張子がjpgやgifなど、特定の拡張子だけ許可する(判別する) 正規表現を教えて下さい。 「http」からはじまる正規表現でお願いします。
>>915 simtelnetにコンパイル済のperl4.019があるけど
それ以外はシラネ
>>917 うわ、こんなものあるのか。
早速コンパイルしてみようと思ったのだが Configure が通らね〜。
う〜ん、そのうちちゃんと原因追及してみるか…
申し訳ありません唐突な質問をお許しください。 perlのモジュールのリファレンスって公開されているようなものではないのでしょうか? IO::socketについて調べようと思ったら何処にもなかったです・・ 本買うしかないんでしょうか?
perldoc IO::Socket
>>914 $URL =~ /(jpg|gif)$/i;
とおもったら、
>「http」からはじまる正規表現でお願いします。
こんな制約があんのか。マンドクセ('A`)
/^
http:.* (jpg|gif)$/i
とすりゃいいだけでは…。そんなにマンドクサいか?
シリアルポートへの接続をしたいのですが、 BaudRate、Parity、Data(bit)、Stop(bit)など 接続条件の設定はどのように行ったらいいのでしょうか?
926 :
デフォルトの名無しさん :04/01/12 11:30
950以降だったらボブサップにケンカ売る!
>>923 にちょと補足。
多分 /^
http:.*? (jpg|gif)$/i が良さげ。
'*' の後の '?' がないと,後でもう一回頭をかかえる事になるかと存じ候。
>>927 へー。
? がある場合とない場合で何が変わりますか?
>>930 質問もとのコードは見ないでレスしただけだYO
>>933 あれか。HTML文字列中のURLを検索とかいうパターンの場合か。
それは確かに?つけたほうがよさそう。^$消して。
>>934 でも、URL の途中に jpg とか gif とか入ってたら×じゃね?
岐阜県関係とか。
おとなしくHTML::LinkExtor使えって言っても検索対象がHTMLとは言ってないわな
938 :
デフォルトの名無しさん :04/01/12 19:44
>>927 フォームからの入力が正しいか調べるために
その正規表現でも大丈夫なんですか?
/^https?:\/\/[\w|\:\@\-]+\.[\w|\:\!\#\%\=\&\-\|\@\~\+\.\?\/]+$/
これはバナーURLが正しく入力されたか調べる正規表現らしいですけど
これを使って特定の拡張子を調べる正規表現に(書き換え)できますか?
>>938 拡張子だけを調べるなら、そんなマンドセー事しなくてもよかろうに
>>938 /^https?:\/\/[\w|\:\@\-]+\.[\w|\:\!\#\%\=\&\-\|\@\~\+\.\?\/]+$/ && /\.jpg$/
941 :
デフォルトの名無しさん :04/01/12 20:01
>>940 &&を使わずに一つにまとめられないですか?
>>941 /^https?:\/\/[\w|\:\@\-]+\.[\w|\:\!\#\%\=\&\-\|\@\~\+\.\?\/]+\.jpg$/
なめとんのか?
>>942 やさしくしすぎじゃろ。
914=938=941 は以後放置の方向で
>>941 フォームで渡ってくるURLの拡張子だけを調べるなら、そんなマンドクセー事しなくてもよかろうに
つーか正規表現勉強しろや。ここはperlすれじゃ。
アプリレベルでどうゆう動作を希望・想定してるか言わないんじゃまともなコードは答えれないぞ 単純なコードだって時と場合によっちゃ冗長だったり不十分だったりするもんだ
947 :
デフォルトの名無しさん :04/01/13 10:50
>912-913 use threads;use Thread::Queue; $q = new Thread::Queue; $q->enqueue($_) for 1..100; @t = map{ threads->create(\&threadFunc,"T$_") } 0..2; for(0..2){ $t[$_]->join; print "T$_ joined.\n"; } sub threadFunc { my($name,$num)=shift; while($num=$q->dequeue_nb){print "$name:$num\n";threads->yield();}} うちのWindowsでActivePerl 5.8.2 build 808 で普通に動いてました。 こまめに他スレッドに切り替わってほしいなら sub threadFunc { my($name,$num)=shift; while($num=$q->dequeue_nb){print "$name:$num\n";threads->yield();}} でなければ切り替わる回数は減ります。 5.8.2は多国語対応が実用的になっておもろい。
みすった。 要するにyieldの有無で順序はかわるよ、と。
949 :
デフォルトの名無しさん :04/01/13 11:44
こんにちは。ちょっと質問させて下さい。 perl で、50程度の小さい数値の加算を連続で続けていくと、 合計値が約2,000,000,000程度くらいになると、それ以降はマイナスの値が出力されてしまいます。 何かいい解決方法はないのでしょうか? #------------------- # 1行ずつデータを受け取り、項目毎に値を合計する | = 1 ; while(<>){ @l = split(/\t/) ; $list{$l[0]} += $l[1] ; ←加算してるところ for(sort keys %list){ printf "%s\t%d\n", $_,$list{$_} ; } print "\n" ; }
>>949 use bigint しる。もしくは Math::BigInt とか。
use Aspect::Trace;
use XML::LibXML::SAX;
するとエラーが出て、どうやら一緒に使えない模様。
相性の悪い CPAN モジュールってあるよね。こんな時、お前らどうしますか?
bigint
>>950 Marcel GrAnauer, Matt Sergeant, Christian Glahnにメール汁
953 :
デフォルトの名無しさん :04/01/13 19:10
変数に2バイト文字を含むかどうかってどうやったら判別できますか?
補足。 シングルクォーテーションマークに囲まれた部分に日本語を含むかどうか調べたいのですが、 $hoge1 = "abc'def'ghi"; $hoge2 = "abc'あいう'ghi"; で、$hoge2の場合だけ抜き出すにはどうすればいいんでしょうか?
>>953 漢字コードに依存、かつ正確にやろうとするとかなり面倒。
簡便な方法でいいのなら、sjis, euc なら /[\200-\377]/ にマッチするかどうかを、
jis なら /\033/ にマッチするかどうか調べれば「ほぼ」判定できる。
>>954 $hoge2 を euc にしてから、
$hoge =~ tr/[\x00-\x7F]//d;
してみるとか。
Perl5.8からは m/[あ-ん]/ みたいなことができるのではないのですか?(よー知らんけど)
958 :
デフォルトの名無しさん :04/01/14 02:29
文章中の英単語の出現数をカウントするスクリプト中で、次の ような正規表現を使いました。 /\b[a-z]+\b/g ほとんどうまくいっているのですが、何故かテキストファイル中にない文字列、 たとえばfiなどなぞの単語をカウントしてしまいます。
なにがおかしいのでしょう?
Perlのコードって何で暗号みたいなの?
>>957 ちうわけでおまえら perl use encoding でぐぐっとけ。
一般人にはこれで十分。
require 'jcode.pl'; ってもう時代遅れなの?
初心者な質問させてください。 BBSを作ったのですが、ブラウザの更新ボタンを押すと 前回の書き込みが付け加えられて更新されてしまいます。 それをなくすにはどうしたらいいのでしょうか。 ご教授よろしくお願いします。
>>952 やっぱりそれしかないか(´・ω・`)
ちょっと粘ってみて、自分で直せなかったらメールしてみるよ。ありがとう。
>>962 プロはもっと違うやり方でやってるとでも言いたいのか?
プロはPHPを使う
プロだってさ
PHP = プロ は PHP
ププッ
PHP = Pretty Hoot Privacy
Pro Home Page
Pu Home Page
EclipseのRegExp プラグインみたいに、 正規表現のチェックができるツールはないでしょうか? この正規表現メモリはどこにマッチするかーなんてときに、 いちいちスクリプトを実行しなくても デバッグすることができるんで、便利だと思うんですが。。
>>947 私の作成したスクリプトや947さんが作成したスクリプトを
シングルプロセッサ上で動作させると正常に終了するのですが、
マルチプロセッサ上で動作させるとやはり正常に終了しません。
つまり、
........................
T1:4998
T1:4999
T1 joined .
のように処理がとまってしまいます。
どなたか助け出してください。お願いします。
>>979 Visual Perlは495ドルもするのか、
重いけどEclipseで我慢すます。
∩_∩ ∧_∧ (。・ヮ・)(・ヮ・。) ゚し-J゚ ゚し-J゚
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
990 :
デフォルトの名無しさん :04/01/15 20:56
PHP最強!
最強!
最弱
Rubyの指輪 曇りガラスの向こうは風の街
994 :
デフォルトの名無しさん :04/01/15 22:38
PHP最高!
PHPってプログラミングに挫折した人の最後の駆け込み寺でしょ?
print("うめるぞよ〜\n");
print("うめるぞよ〜\n");
というか、ある言語を頭ごなしに毀誉褒貶するやつはシメジ
print("うめるぞよ〜\n");
言語に貴賎なし。
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。