超初心者なのですが質問させてください モナ: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を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。