1 :
デフォルトの名無しさん :
2010/10/22(金) 22:45:29
# [Perl 日本語処理の基礎の基礎] # このレスは、Windows の ActivePerl で日本語処理を行う場合のテンプレートです。 # このレスの内容をそのまま、UTF8 形式のソースファイルに保存して下さい。 # 入出力ともシフト JIS 形式のファイルまたは DOS 窓を想定しています。 # まず、以下の行を先頭に入れて下さい。 use utf8; use open IO => ":encoding(cp932)"; binmode STDIN => ":encoding(cp932)"; binmode STDOUT => ":encoding(cp932)"; binmode STDERR => ":encoding(cp932)"; # ※1 use Encode; # 次に、あなたが実行したい処理の内容を入れて下さい。 $file = 'C:/なんたら/かんたら.txt'; open my $fh, '<', encode("cp932", $file) or die $! ; # ※2 print <$fh>; # 以上の内容は、日本語処理が解らない人でも、とりあえず日本語処理ができてしまう # おまじないです。条件が異なる場合の対処方法は、ご自分で勉強して下さい。 # 【注】※1. の行を入れると、DOS 窓への日本語出力は簡便になりますが、 # ソースファイル名に非 ANSI 文字が含まれる場合に die 文の出力が失敗します。 # ※2. OS に渡す文字列(ファイル名,dos コマンドのオプションなど)は、 # この例のように cp932 でエンコードする必要があります。
8 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/22(金) 22:52:24
俺はこのゴミスレが消滅するまで 戦う
>>1 おつ。
前スレのCentOS+モデム男なんだが、↓のソースでやってみたが、やっぱり"AT"しか返って来ない。
"AT"[CR]"OK"[CR]と返ってきてほしいんだが、どうして???
************************************
#! /usr/bin/perl
use Fcntl;
sysopen (COM, "/dev/ttyS0", O_RDWR) || die; # ttyS0=COM1, S1=COM2, ...
syswrite (COM, "AT\n", 3) || die;
sleep(5);
$data = "";
sysread (COM, $data, 20) || die;
print $data, "\n";
************************************
11 :
デフォルトの名無しさん :2010/10/23(土) 11:28:07
3003,aaa 3004,bbb 3005,ccc ・ ・ こんなレコードが何百万行っていうCSVがあって、 1カラム目の値をキーとして、2カラム目の値を取得したいんです。 このリクエストは1分当たりに何度も発生します。 当然、1カラム目の値はユニークです。 で、リクエストが発生するたびに、 単純に先頭から検索していったんじゃ、時間がかかるんで、 このCSVをハッシュに持っておいて、 レスポンスを返すようなデーモンを作れば、速くなるかな〜 と考えてるんですが、方向性は合ってますかね? #DBは使えない環境です。。。 ここで聞くことか迷ったんですが、 組むならperlで組むんで、こちらで聞いてみました。 よろしくお願いします。
1分あたりに何度ぐらいならそこまでやらなくてもDBMでいいんじゃねーの?
speedycgiでおk
my $re_quote = '[a-z]+'; $str =~ /$re_quote|[0-9]+/; と、 my $re_qr = qr/[a-z]+/; $str =~ /$re_qr|[0-9]+/; とでは、どういう違い(メリット?デメリット?)があるのでしょうか?
>>15 qr//は事前にコンパイルされるのが特徴なんだけど、
その二つだと、あまり違わない。
迷ったらqr//推奨。
18 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/24(日) 08:25:29
モダンな書き方はな? いままでの常識とは逆の書き方マイナーなほうで書くのが正しいんだよ^^ あんまりかかないほう=真だから
qr に g は使えない
日本語は面倒臭いですね を 日本語/は/面倒臭い/です/ね のように、単語や文節で区切ってくれるモジュールとか無いのかしら?
sub new{ my $class=shift; return $class; } my $o=person->new; #変更点 print $o; だとpersonと表示されますが、$o=person::new;に変えると何も表示されません。 詳しい方教えてください。
すみません勘違いしてました person::newだとただのサブルーチンの呼び出しですね 引数が必要でした。
23 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/24(日) 11:23:07
お前バカだろ?
24 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/24(日) 11:25:43
てめえのせいで2レス無駄になっただろうがー
日本語の形態素解析のモジュールあったかな
29 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/24(日) 19:23:56
超絶最強荒らし・Perl っていう本出たら買う?
その本でたら絶対買うよ
おう、考えてやるよ
欲しいなあwww
33 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/24(日) 19:28:18
リロードボタンカチカチ同期型チャット全盛期乙
($n,$m) = @ARGV; print "keiro: ",keirosuu($n,$m),"\n"; sub keirosuu{ my ($n,$m) = @_; print "$n,$m\n"; if (($n==0)||($m==0)){return 1;} return keirosuu($n,$m-1) + keirosuu($n-1,$m); } このプログラムが何回繰り返すことになるのかよく分からない。再帰法は頭がぐちゃちゃになるぜ。 誰か教えてくれ
W3CDTF を UNIX TIME に変換する 良さげなモジュールってありますか?
Yada Yadaオペレータの語源はなんですか?
>>39 戦前のアメリカのコメディアンのギャグフレーズ
41 :
デフォルトの名無しさん :2010/10/25(月) 22:52:19
test
42 :
デフォルトの名無しさん :2010/10/25(月) 23:23:24
質問よろしくお願いします。 TCPサーバの生存監視ツールを作成しようとしています。 tcpクライアントより問い合わせを行い、一定時間応答が帰らない場合 タイムアウトエラーとしたいと考えています。 調べたところ、IO::Socket::INETにTimeOutオプションというのがあったのですが 使用方法がいまいちよくわかりません。 タイムアウトになったことをどのように検知するかご教授頂けないでしょうか。 my $socket = IO::Socket::INET->new( PeerAddr => 'localhost', PeerPort => 9999, Proto => 'tcp', TimeOut => 5 );
LWP::Useragentのis_errorではダメなのか
44 :
42 :2010/10/26(火) 00:15:54
>43 ご教授ありがとうございます。 さっそく調べたところLWP::Useragentはhttpを扱うようですね。 監視対象のサーバがTCPサーバですので、IO::Socket::INETが適当かと思いました。 やりたいこととしては、TCPサーバが3wayハンドシェイク終了後、クライアントからのputに応答を返さない事象がごく稀に発生するため それを検知するツールを作成しようと考えています。 もちろんポートが開いておらず、3wayハンドシェイクに失敗する場合も検知したいと考えています。
45 :
36 :2010/10/26(火) 00:47:33
対象サーバーは HTTP を扱ってるサーバーなんでしょ? だったら HEAD リクエストに掛かった時間でいいんじゃないの? ミリ秒なら TimeReso だっけ?で得られるわけだし・・・
>>42 コネクト失敗するとundefが返ってきて、$!にエラーが入る。
... or die $!; を書いておくとわかるよ。
perlでスタンバイ・再起動することはできますか? どうすればできるでしょうか?
面倒そうだし、バックダッシュでコマンドを書いてしまえ。 たとえばWindows XPのスタンバイなら `C:\\WINDOWS\\system32\\rundll32.exe powrprof.dll,SetSuspendState`;
スクリプトの設定を別のファイルに書いておき、それを読み込む場合 FILE : test.pl my $config = { 'datadir' => 'pastdata', }; sub getconfig{ return \$config; } FILE : main.pl require 'test.pl'; print $$config->{'datadir'}; このようになるわけですが、 print $config->{'datadir'}; このように記述したい場合、どこをどうすればいいでしょう?
my $config = ${getmemoconfig()}; ってやったら $config->{'datadir'}; でもいけたけど・・・スマートじゃないよねぇww
>>50 FILE: test.pl
{ datadir => 'pastdata' }; # 最後にハッシュリファレンスを置く
FILE: main.pl
my $config = do './test.pl';
print $config->{'datadir'};
>>50 FILE: text.pl
my %config = (datadir => 'pastdir');
sub getconfig {
return \%config;
}
1;
FILE: main.pl
require('test.pl');
my $config = getconfig();
print $config->{datadir};
これでいいのか?
>>53 お〜出来た!!
ついでに質問なんですが ^-^;
1行目は
$cidlist->{$tmpCID} = { 'name' => $tmpNAME };
って追加してるけど2行目で追加する時は
%{$cidlist->{$tmpCID}}->{'count'} = $tmpCNT;
ってやるしかないの?
1行で書くなら
$cidlist->{$tmpCID} = { 'name' => $tmpNAME, 'count' => $tmpCNT };
って出来るのは分かるけど、後々追加したいと思ったときに知っておきたい。
%{$cidlist->{$tmpCID}}->{'count'} = $tmpCNT; ってやるとワーニング出てた orz
\x0Aを出力すると\r\nで出力されるけど、これを意図的に\nのみするとか出来たりするもんなのかしら?
>>54 use strict;
use warnings;
use Data::Dumper;
my $href;
$href->{'hoge'} = { 'name' => 'foo' };
$href->{'hoge'}{'count'} = 5; # これのこと?
$href->{'fuga'} = { 'name' => 'bar', 'count' => 12 };
print Dumper(%{$href});
あ〜!! そうゆう記述どっかで見たことある!ww 久々に書いてると閃きすら起きない事実に凹んできたw ありがとう
うちの場合ローカルで使うツールだと 設定は YAML::Syck を使って YAMLファイルから読み込んでるなあ
>>49 ありがとうございます。
時間帯を指定してスタンバイから復帰するにはどうしたらいいでしょう?
$ninja={ [1,2,3,4,5],[2,3,3,3,3] }; これは日本語的に何て言えばいいですかね? 無名配列の無名ハッシュでいいんですかね? それとも配列のハッシュですかね? ながったらしく無名配列へのリファレンスの無名ハッシュへのリファレンスみたいに長ったらしくいうんでしょうかね?
生まれつき脳が弱くて日本語が不自由です 教えてください・・・
無名ハッシュは違いましたね $ninja={ 'unko'=>[1,2,2,2],'kasu'=>[7,7,7]}; 教えてください・・・
もういいです・・・
配列のハッシュで良いんじゃない?
>>64 $ninjaを指して言うならハッシュリファレンス
$ninja->{unko}を指して言うなら配列のリファレンス
データ構造を指して言うなら配列で構成されるハッシュとでも言えばいいのか
なんにせよお前糞コテだろ
68 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/28(木) 21:52:12
糞とか言うのやめろ
69 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/28(木) 21:53:06
tokuhirom未満のゴミがわめいてんじゃねえよごみ
70 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/28(木) 21:54:01
>>61 WindowsAPIのアレはスケジューラで起動しないらい。
vbsで組んでみたよ。jt.exeは予めインストールして、定数を適当に設定しといて。
Shell > cscrpit.exe foo.vbs [n分後|年/月/日 時:分]
てな感じで動くんで、Perlからも呼び出せると思う。
Set wShell = WScript.CreateObject("WScript.Shell")
Set arrayArg = WScript.Arguments
Const strJt = "C:\path\to\jt.exe"
Const strApply = """C:\path\to\foo.bat"""
Const strParam = """"""
Const strWork = """C:\"""
Const strUser = """foo\bar"""
Const strPass = """brahbrah"""
Dim strDate
Select Case arrayArg.Count
case 0 strDate = DateAdd("n", 1, Now)
case 1 strDate = DateAdd("n", arrayArg(0), Now)
case else strDate = DateValue(arrayArg(0)) & " " & TimeValue(arrayArg(1))
End Select
Dim strCmd strCmd = strJt & " /ctj StartDate=" & Month(strDate) & _ "/" & Day(strDate) & "/" & Year(strDate) & _ " StartTime=" & Hour(strDate) & ":" & Minute(strDate) & _ " Disabled=0 Type=Once" & _ " /sj ApplicationName=" & strApply & " Parameters=" & strParam & _ " WorkingDirectory=" & strWork & " DeleteWhenDone=1 SystemRequired=1" & _ " /sc " & strUser & " " & strPass & "/saj %windir%\Tasks\resume.job" ' WScript.Echo strCmd wShell.Run strCmd, 0, TRUE wShell.Run "C:\WINDOWS\system32\taskmgr.EXE" wScript.Sleep 1000 wShell.SendKeys "%ub%fx"
x cscrpit.exe o cscript.exe だった。以上スレ違い。
perl 勉強中の者です。 タブ区切りのテキストデータを読み込んで、行と列の二次元配列を作ろうと思い このようにしたらとりあえず動きました。 $count = 0; open(IN, $ARGV[0]); while($line = <IN>){ @linedata = split(/\t/, $line); for($i = 0; $i < @linedata; $i++){ $datas[$count][$i] = $linedata[$i]; } $count++; } close(IN); ただ、もっとスマートに書けないものかといろいろといじってみても うまくいきません。 @datas[$count++] = split(/\t/, $line); みたいな感じで一発で配列を代入するにはどうしたらいいでしょうか?
my@linedata = split /\t/, $line; push @datas, \@linedata;
>>74 chomp, push @data, [ split /\t/ ] while <IN>;
78 :
74 :2010/10/30(土) 01:07:11
>>75 ,77
素晴らしい回答を有難うございます。
折衷案で
open(IN, $ARGV[0]);
while($line = <IN>){
push @datas, [ split /\t/, $line ];
}
close(IN);
でいきたいと思います。
全然関係ないけど、dataは複数形だね
じゃぁ単数形は?
辞書引け
datum
83 :
Perl忍者 ◆M5ZWRnXOj6 :2010/10/30(土) 10:36:18
今初めて使ってみたんだけど、Net::Trackback は何となくバグってるような…。
85 :
デフォルトの名無しさん :2010/11/01(月) 17:53:08
正規表現で数字だけじゃない語にマッチさせたいのですが書き方が分かりません。 マッチして貰いたいもの _fff_RRR check1 1check マッチして貰いたくないもの 11111 444.55 -34 +56 現在はとりあえず(\w+)でマッチさせてその中から[a-zA-Z_]を全く含まないものを省いてます。
Scalar::Util::looks_like_number 使え
87 :
デフォルトの名無しさん :2010/11/01(月) 18:06:36
Scalar::Util::looks_like_numberすごいですね。 ありがとうございました。
threadsとuse utf8やuse encoding "utf8"は同時には扱えないのでしょうか? 例外処理でPerlそのものが落ちるようです。 #OS: WindowsXP SP3 #ActivePerl-5.12.2.1202-MSWin32-x86-293621 #!/usr/bin/perl -w use encoding "utf8"; use threads; my @threads; for(1..5){ #例外処理で落ちる my $thread = threads->new(\&my_thread, $_); push(@threads, $thread); } foreach(@threads){ $_->join or die $!; } exit; sub my_thread { threads->yield(); sleep(1); return 1; }
open(IN, '<:encodint(euc-jp)', test.txt); これって test.txt がどんなエンコーディングで書かれてようが、 euc-jp に変換して読むって意味じゃなくて、euc-jp で書かれてる前提で読み込むんですよね? ファイルが euc じゃなきゃ変換してやんなきゃいけないんですよね?
>>88 perldoc encoding
> Thread safety
> use encoding ... is not thread-safe (i.e., do not use in threaded applications).
91 :
デフォルトの名無しさん :2010/11/02(火) 03:44:07
教えてください。 ひとつの文字列に対して、いくつかのパターンで置換をしたいと思っています。 パターンと置換文字列のペアを配列に入れておいて処理を繰り返せば楽…と思ったのですが サブパターンを取得して置換するところがうまくいきません。どうすればいいのでしょうか。 置換するパターンを直接プログラムに書くと期待どおりに置換されます。 $a ='testbigtest'; $a =~ s|test(.*)test|<strong>$1</strong>|; print $a; 結果→<strong>big</strong> パターンを変数に入れて楽をしようとすると同じパターンで置換をしているつもりでも結果が違ってしまいます。 $a ='testbigtest'; $p1 ='test(.*)test'; $p2 ='<strong>$1</strong>'; $a =~ s|$p1|$p2|; print $a; 結果→<strong>$1</strong>
もっとずっといい方法があるだろうなあ $a ='testbigtest'; $p1 ='test(.*)test'; $p2 ='<strong>$1</strong>'; $tmp = "\$a =~ s|$p1|$p2|"; #print "$tmp\n"; eval $tmp; print $a;
分かりやすいように書いたのだと思うが、 $tmp いらないんじゃないかな 後、いつもどおりですが $a は...
$str = 'testbigtest'; $p1 ='test(.*)test'; $p2 = '"<strong>$1</strong>"'; $str =~ s|$p1|$p2|ee; print $str; これぐらいしか思いつかなかった。
95 :
91 :2010/11/02(火) 05:54:16
ありがとうございます。 一度式に直して評価するというアプローチ…急がば回れと。
置換処理ごと配列に入れる。 my $str ='testbigtest'; my $p = sub{ $_[0] =~ s|test(.*)test|<strong>$1</strong>| }; $p->($str); print $str;
97 :
デフォルトの名無しさん :2010/11/02(火) 20:16:28
Switch.pm を見ると、$::_S_W_I_T_C_H とあるのですが、$:: ってどういう意味なんでしょうか? 自分のpackageということ?
$::foo == $main::foo
99 :
デフォルトの名無しさん :2010/11/02(火) 20:28:26
my $test = +{ key => 'value' }; my $test = { key => 'value' }; 前者は+を付けてんだけど、どっちも同じことやってんの? 何か使い分けあるのかな?
単項演算子
101 :
デフォルトの名無しさん :2010/11/02(火) 21:20:29
102 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/02(火) 22:56:50
Perlハッカーなのっていいですか?
103 :
デフォルトの名無しさん :2010/11/03(水) 16:33:20
>>100 すまん、ここで単項演算子を使う意味がわからんのだ。
書いた本人に聞いた方がいいんじゃないの。 安全のため、ハッシュには必ず"+"を付けるぐらいのものかも知れないし。
初耳だ
そうなのか
>>106 安全のためにハッシュに+を付けるてのが
+で何してて何が安全なのかなぁ
例えばMoose::Utilにもこんなのあるんだよね。 sub get_all_attribute_values { my ($class, $instance) = @_; return +{ map { $_->name => $_->get_value($instance) } grep { $_->has_value($instance) } $class->get_all_attributes }; } なんで+?
110 :
104 :2010/11/03(水) 21:04:56
>>108-109 http://perldoc.jp/docs/perl/5.10.0/perlref.pod Making References reference, creation referencing
3. hash, anonymous { {} curly bracket bracket,
curly brace hashref hash reference reference, hash
> 先頭にある +{ や {; が、その式が実際にはハッシュのリファレンスなのか
> ブロックなのかの曖昧さを除去するためにあります。
原文だと
> The leading C<+{> and C<{;> always serve to disambiguate
> the expression to mean either the HASH reference, or the BLOCK.
他、
>>52 に書かれているtest.plのようなハッシュの先頭に"+"を置いたりしてるのは見たことある。
>>99 の答えにはならないけど。
ハッシュかブロックかのカッコを見分けるためにあるのか また一つ賢くなったような気がする
112 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/03(水) 22:32:02
そんなのもしらなかったのかよw
113 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/03(水) 23:18:34
自分が考えてるよりレベルって低いんだねw
ハッシュかブロックか曖昧なケースってどんなとこ? evalとかmapとか? 少なくともreturnは曖昧でないよなぁ
115 :
デフォルトの名無しさん :2010/11/04(木) 07:17:46
nameカラムには「test test」と格納されています。 以下のクエリーを発行 select name from testdata 1.DBIで発行し、画面出力 → 「test」が出力される 2.puttyからmysqlを立ち上げ、発行 → 「test test」が出力される 実行結果が変わってくるのはなぜでしょうか? 色々なデータで試してみましたが、半角スペースが出現すると それ以降は読み捨てられてしまうようです。 sele
116 :
◆M21AkfQGck :2010/11/04(木) 09:29:20
ImageMagickで0からgif画像をドット絵的に作るにはどうしたらよいのでしょうか? いろいろ調べたつもりですが見つけることができませんでした
>>115 これまた難儀な質問だ
普通そんなことはないからプログラムがおかしいんじゃないか?
該当箇所見なきゃ誰もどうとも言えんと思う
118 :
104 :2010/11/04(木) 17:35:41
>>116 こんな感じでドットが打てる。
$image->Set("pixel[$x,$y]" => '#000000');
119 :
デフォルトの名無しさん :2010/11/05(金) 14:11:23
以下のようにMYSQLへSQL文を投げているのですが、実行されません $sth = $db->prepare("update (select @i:=0) as dummy,Result set ResultID = @i:=@i+1"); $sth->execute; 同じプログラム内に書いた別のSQL文は実行されているのでMYSQLへの接続は出来ていると思います また、同じSQL文を直接MYSQLへ与えた場合は問題なく実行されました 何が問題で実行されないんでしょうか
>>119 クエリ投げる前に Perl さんが配列 @i を展開しようとしてくれますから。
use strict してたらすぐ気づきそう。
perl から Adobe Acrobat を操作することは出来ますか? やりたいことは、WordやPPTファイルを検索し、PDFに変換(図などもそのまま)することです。 Acrobat の方でバッチ処理は不可能なようなので、 Perl からファイルのリストをAcrobatの方に送りつけて、Win32モジュールとかでPDF変換処理をさせる、なんてことを考えました。 可能でしょうか? 特にPerlにこだわっているわけではないので、他にいい方法があれば誘導をお願いします。
質問させてください 08:00:09:61:aa:c9 LLC U P, func=TEST; DSAP NULL LSAP Individual, SSAP NetBIOS Command 172.16.114.207 TCP 80 > 6193 [FIN, ACK] Seq=663 Ack=314 Win=32736 Len=0 199.95.74.90 TCP 6193 > 80 [ACK] Seq=314 Ack=664 Win=31457 Len=0 このような文字列が入ったtxtを読み込み 最初のスペースから左側だけを抽出しようとしたのですが どうしてもうまく行きません プログラムは以下の通りです $txtには上記の文字列が入ってます my $match3 ='(.*)(\s)(.*)'; if( $txt =~ /$match3/){ print "前半$1\n"; print "指定文字$2\n"; print "後半$3\n"; }
まああれだ、最後の手段として、 Win32::GUITestがあれば何でもできる
125 :
123 :2010/11/07(日) 02:45:40
望む結果はprint "前半$1\n"; に 08:00:09:61:aa:c9 172.16.114.207 199.95.74.90 と出て欲しいのですが 結果は print "前半$1\n"; ⇒ 172.16.114.207 TCP 80 > 6193 [FIN, ACK] Seq=663 Ack=314 Win=32736 print "指定文字$2\n"; ⇒ スペース print "後半$3\n"; ⇒ Len=0 となってしまいます どうやら一番後ろから参照されているようです 一番頭から参照をするメタ文字の「^」を入れてみましたが 結果は同じでした 非常に低レベルな問題なのですが どうかご教授御願いします
use strict; use warnings; foreach my $line (<DATA>) { if ( $line =~ m{ \A ( .+? ) ( \s ) ( .+ ) \z }xms ) { print "前半$1\n"; print "指定文字$2\n"; print "後半$3\n"; } } __DATA__ 08:00:09:61:aa:c9 LLC U P, func=TEST; DSAP NULL LSAP Individual, SSAP NetBIOS Command 172.16.114.207 TCP 80 > 6193 [FIN, ACK] Seq=663 Ack=314 Win=32736 Len=0 199.95.74.90 TCP 6193 > 80 [ACK] Seq=314 Ack=664 Win=31457 Len=0
PBP風味は脇に置いておくと、 量指定子(*とか+とか)が「強欲」(最長一致) であることに着目するってことだな だから上記のように.+?とするか、あるいは [^\s]+とする必要がある
128 :
123 :2010/11/07(日) 02:55:12
ありがとうございました できました *と+が原因だったとは 全然考えてませんでした もう少し勉強していきます
IPアドレスにも気をつけて><
行単位で読み込んでるなら s オプションは要らないんじゃない?
数字を、 **100 *1000 みたいに、桁数固定でゼロサプレスするけど代わりに*を埋める、みたいなことを printfでできますか
直感だけどw %*5d は?
駄目でした(やっぱり)
134 :
デフォルトの名無しさん :2010/11/07(日) 11:06:49
JSON::XS の pretty で出力する js が非常に見にくい(読みにくい)のですが、 なにか見やすく整形できるモジュールないでしょうか?
$str = '*****' . $num; printf substr($str, length($str) - 5, 5); はいはい邪道邪道
$temp = sprintf("%5d\n", $num); $temp =~ s/ /*/g; print $temp; どうしても途中に一回変数を挟むな
こんなんはダメ? print '*' x (5 - length $num) , $num;
>>135 自分もそれ思いついた
けど、
>>137 が一番見やすいのかな?
あっ、質問主じゃないですが ^-^;
題意の通りにprintfを使うと printf("%s%d", '*'x(5 - length $num), $num); こんな感じか
日本語を暗号化するスレはここですか?
PGPでおk
英和辞書買ってperldocをだな(ry
逆引きは自分がやりたいことが載ってるとは限らない
リファレンスはその言語の簡単な辞書 (簡単というほど薄くはないけどね)
なんとか大全とかは立ち読みして、自分がやりたい事か、似たことをやってる本を買うべき。
0円で済ませたいなら っ【ぐぅぐる】
>>143 perldoc をとは言うが、本は本で役に立つんだぜ?
>>142 どっちもラクダぐらい読んで理解できるレベルじゃないとだめだろ。
ラクダを難しいと言うようじゃリャマ(オライリーのはじめてのPerl)
あたりでまずは基本を勉強した方がいいと思うぞ。
ラクダは1つの事に対しての情報量が多すぎてめんどくさいw
147 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/07(日) 20:05:42
そもそもPerl難しいっていうやつはヴァカ
148 :
デフォルトの名無しさん :2010/11/07(日) 22:08:40
そんなあなたには、PHPのオンライン・ドキュメントがおぬぬめ
http://php.net/manual/ja/index.php この関数は将来消える予定だから使うなカス。
この関数はPHP5だけで使えるんだから4厨は使うなカス。
この関数はPHP5.2以降でしか使えねーんだから4厨は使うなカス(え?
この関数はPHPのコンパイル・オプションを指定し直して、インストールし直して、Apache再起動しなきゃ使えるわけねーじゃん!プギャーーー
ウニコード?そんなの気にすんな。goto文さえあれば最強よ。
149 :
デフォルトの名無しさん :2010/11/08(月) 00:18:48
Perl難しい (>_<)
糞コテはヴァカの間違いだろ
151 :
デフォルトの名無しさん :2010/11/08(月) 02:40:38
Perl5が出たばかりの頃に買ったオライリー本を久しぶりに見たら浦島太郎状態なんですが。 流れが速すぎるよう(つд⊂)エーン
>>123 splitもご検討ください。
>>151 2版の青ラクダから、あんまり変わって無い気がするけどな。
Web系は別物かも。クライアント側含めて。
153 :
デフォルトの名無しさん :2010/11/08(月) 06:18:32
>>152 青ラクダの初版です。Web系はごりごり書いてるからなあ。(´・ω・`)ショボーン
154 :
デフォルトの名無しさん :2010/11/11(木) 03:37:54
use threads; use threads::shared; my @A :shared; for(0..9){push @A,[$_,$_+1,$_+2]} Invalid value for shared scalar at /home/abc/threadtest.pl line 4 こうなってしまうのはなぜですか?エラーを回避する方法はありますか?
>>154 for(0..9){ push @A, shared_clone([$_, $_+1, $_+2]) }
お前は何を言っているんだ
158 :
デフォルトの名無しさん :2010/11/12(金) 16:10:47
perlのモジュールについて勉強したいんですがおすすめの書籍教えていただけませんか 独習perlは読みました CPANにあるモジュールを使いこなせるようになりたいです。 perldocだけだと関数の使い方が完全にはわからないのです
>>CPANにあるモジュールを使いこなせるようになりたいです 貪欲すぎてワロタ 使い方が分からないんじゃなくて、発想しようとしてないから考えがまとまらないんだろ? テキスト読むだけじゃだめだ 心で感じろ!
CPANモジュールってむやみやたらと全部覚えるというよりは、 ある特定の問題があったときにこれをやるモジュールないかな って探して使うもののような気がする。とにかく数が多いし いらない人にはほんとに一生縁がないものが大半だよ。その 問題に関わる人にとっては有り難いわけだけど。
必要なモジュールを探し当てる検索テクニックと ドキュメントを素早く把握する速読法が 有効のような気がした
162 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/12(金) 17:00:52
お前にチャクラの流れをよむことは無理 覚えるコツ しらべるのではなく 作る物ー>どんな処理をするかー>このモジュールを使えばすませられる みたいにかんがえられるから なので、モジュールから探すのではなく 作る物を探し他方害意
多分モジュール(オブジェクト指向も含めて)がどういうものなのかを知りたいんじゃないのかな? importとかnewとか。
164 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/12(金) 17:05:37
モジュール紹介してる書籍なんてねえよ さがせかす自分でさがせごみ 消えろ
各モジュールのマニュアルと、中に入ってる sample/ か t/ 嫁ばだいたいわかるだろ。
とりあえず前世紀のゴミクズCGIを参考に自分で書く。 → その後CGIモジュール使って書き直してみる。 → モジュールウマーってなる。 ネットだけで十分な情報量だと思うよ。 あとは何よりも目的が大事。 探してみたら、日本の祝日・休日(振替休日付き)なんてモジュールもあるしな。
>>166 前世紀に書かれたようなヒドイ書き方の CGI を
今の書き方にポートするなんて
書く以前に読むのが苦行過ぎるよ。
my ってなにそれ? -T なんて知らないよ?
とか jcode.pl とかの世界だろうし…。
抽象化されたCGIのパッケージやらモジュールやら使うってことだろ……
>>166 でも祝日休日のモジュールは定期的に保守しなきゃだめだな
スパンは数年単位でいいだろうが
170 :
デフォルトの名無しさん :2010/11/13(土) 02:30:08
モ娘。のデータ出してくるモジュールまであったよ 今もやってるか知らんが
DB_Fileで100KB程度のデータを一つのキーに入れた所、 foreach(keys())でやってもそのキーが出てこなくなりました。どうすれば良いのでしょうか。
暗号ですか、素数ですか?
my $num_fork = 4; while ( $num_fork ) { my $pid = fork; if ( !defined $pid ) { die 'プロセスの生成に失敗<br>\n'; } elsif ( !($pid) ) { if ( $num_fork == 4 ) { $aaa = 'aaa'; } elsif ( $num_fork == 3 ) { $bbb = 'bbb'; } elsif ( $num_fork == 2 ) { $ccc = 'ccc'; } elsif ( $num_fork == 1 ) { $ddd = 'ddd'; } exit $num_fork; } $num_fork --; } print $aaa.$bbb.$ccc.$ddd; aaabbbcccdddと表示されて欲しいのですが、exitしているために変数が参照できません。 exitを消すわけにもいかず、どうすればいいのか悩んでいます。 解決策があればどなたかご教授願えないでしょうか?
子プロセスで変更した内容は親プロセスにはコピーされません。
やっぱり外部ファイルに書き込んで読み込むしかないですかね。 ありがとうございました
>>173 OS環境にもよるけど、パイプやIPCの共有メモリなどでも実装できるよ。
PerlIOレイヤーに:encoding(UTF-8)とか したときに、ヘンなデータがあったら、 map to Unicodeできないと警告されます。 その警告を黙らせる方法はありますか? 教えてください。 no warnings 'utf8'は試しましたが、 黙りませんでした。
UTF-8で保存
EUC とかを utf-8 に変換すると出るよね 有名なのが 〜 (全角チルダ) と 〜 (波ダッシュ) かな
ある点 A が多角形に含まれるかどうか判別するモジュールってあります?
計算は簡単
いまググって見てた。 計算して試して結果が OK なら OK。 ってのがなんか気持ち悪いから理解しようとしてるんだけど、 いや〜数学赤点ギリギリだった俺からすると難しいw PostgreSQL とか MySQL に、点が多角形の中に含まれるかどうかチェック出来る演算子とか関数があって、 プログラムで学ぼうとしてる自分にかなり誘惑ww
点から頂点に向かう角度を足して、 0に戻れば外、一周すれば内
>>177 use Encode qw(:fallback_all);
use PerlIO::encoding;
#$PerlIO::encoding::fallback = STOP_AT_PARTIAL;
$PerlIO::encoding::fallback = PERLQQ | STOP_AT_PARTIAL;
>>180 cpanにポリゴンのモジュールあったよ。
こっちは、多角形の一点から、調べたい点まで線を引いて、
辺の交差回数で調べるオーソドックスな方法だった。
$data が $word ($wordの中身は毎回変化します)を含むかどうかを 正規表現で調べたいときはどうすればいいでしょうか? if($data =~ /$word/) としても動かなくて・・
/\Q$word/とか?
まず$wordの中身をprintで確認 文字化けの可能性とかある
188 :
デフォルトの名無しさん :2010/11/16(火) 22:58:13
すみません、授業でperlを扱っているのですが、 標準入力から受け取って、split演算子の使うやり方がどうもわかりません。 やってる問題は 「dataに半角改行で区切られた3つの数字を辺とする三角形は何個作れるか」 です。 自分が下のように書いたのですが、どうすればよいでしょう。 for ($x,$y,$z)=chomp(split/ /,(<>)){ $a=$x+$y; $b=$y+$z; $c=$z+$x; if(($a>$z) and ($b>$x) and ($c>$y)){ print"$a,$b,$c,$x,$y,$z"; $count++; } } print "$count \n"; お願いします
189 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/16(火) 23:15:55
perlの問題っていうより 頭の問題 宿題スレいけゲハ
190 :
デフォルトの名無しさん :2010/11/16(火) 23:57:30
> 半角改行 この時点で超難問だな。 NASAにでも相談してくれ。
chompの戻り値が入ってるんじゃね?
どうでもいいけど括弧1個足りなくね?
スレは合ってるんだけど、宿題だと判るとやりたくない
全角改行を探せという問題か・・・ \r や \n (Mac とか Linux) が単独で出てくる場合が半角改行で、 \r\n (Windows) のように出てくるのが全角改行。 ってとこかな。 俺、頭いい!!←
195 :
デフォルトの名無しさん :2010/11/17(水) 00:25:03
皆の者ちょいと落着きなされい > すみません、授業でperlを扱っているのですが この言質からすると、こやつは宿題厨ではなく、情弱日狂組でおじゃるぞ
196 :
デフォルトの名無しさん :2010/11/17(水) 00:53:50
188です たくさんレスありがとうございます。 >191 そうかもしれないです。 printで表示されたものが全部一緒(dataファイルの最初の行)でした。 >195 日狂組ってなんですか??
女子交じゃ仕方ない。一肌脱いでやるか $s = <>; ($x, $y, $z) = split(/ +/, $s); print "x=$x y=$y z=$z\n";
あー改行なんだっけ split(/\n/, $s); $s=<>; じゃムリだと思うが
>>188 ---- dataの例
4
5
6
----
こんなんだったら、これで。
chomp(my $x = <STDIN>);
chomp(my $y = <STDIN>);
chomp(my $z = <STDIN>);
201 :
185 :2010/11/17(水) 14:39:12
>>186 >>187 レスありがとうございます。
$wordの中身が文字化けしてました;;
原因は$wordの末尾の改行をchompで取り除いてた(つもりだった)のですが,
LFしか削ってくれてませんでした。
今はActivePerl5.10.1のx64版を使ってるのですが,
昔のActivePerlはchompでCR+LFを削ってくれてたような記憶が・・
仕様が変わったんですかね。
特に変わってないんじゃないの。
chomp
http://perldoc.jp/docs/perl/5.10.0/perlfunc.pod > $/ (English モジュールでは、$INPUT_RECORD_SEPARATOR とも言う) の
> その時点の値に対応する行末文字を削除します。
my $str = "\x0d\x0a";
printf("\$/ => %0v2x\n", $/);
printf("str => %0v2x\n", $str);
chomp($str);
printf("chomped => %0v2x\n", $str);
結果。
$/ => 0a
str => 0d.0a
chomped => 0d
203 :
デフォルトの名無しさん :2010/11/19(金) 23:20:25
perlと直接関係はないんですが、 パスワードを設定して貰うのに、qwer とか安易なパスワードの時に、 ちょっとしたメッセージを出したいのですが、そういう安易パスワードリストみたいなのはないでしょうか? もしくは英単語リストみたいな。 自分でも安易なパスワード集というのを考えてみたのですが、おそらく漏れが多いと思うので・・。
>>203 mechanizeで辞書サイトの検索結果を取ってくりゃいい
アルファベットと数字を混ぜることを強制する
>>204 ちょwwwパスワード外に投げんなよwww
「パスワード 辞書」でググると物はすぐ出るんだけど、 量多いし文字数やパターンで判定するのが一般的じゃないかな
209 :
203 :2010/11/20(土) 10:13:22
小文字4文字の全組み合わせ数は456976 一瞬で検索できる
211 :
デフォルトの名無しさん :2010/11/20(土) 17:26:24
非常に簡単な正規表現なんですが どうしてもわからないので質問させてください 改行コードを含むテキストに書かれている文章を 改行コードも含めて抽出しようと思うのですが テキストの内容は Internet Protocol, Src・・・・ (ここが抜き出したい部分で、約10行ほど) Transmission Control Protocol, ・・・・ 以下続く・・・・ Internet ProtocolからTransmission Control Protocolまでの中間の部分(改行コードあり)を 抽出したいのです 書いたプログラムは以下の通りです while ( $message = <FILE>){ $match = '(Internet Protocol)(.*)(Transmission Control Protocol)'; if( $message =/$match/s){ print "$2"; } } print "処理完了\n"; 正規表現にsを加え$2と書けばInternet ProtocolからTransmission Control Protocolまでが 抽出されるか思いましたがダメでした。 レベルの低い問題ですが どうかご教授御願いします
1行づつ読み込みループで 抽出範囲開始文字列(IP)がある・・・フラグON、バッファクリア 抽出範囲終了文字列(TCP)がある・・・フラグOFF、バッファを出力 それ以外・・・フラグONなら行データをバッファに蓄積 でいいんじゃね?
read FILE, my$messages, -s FILE; $messages =~ /Internet Protocol(.*)Transmission Control Protocol/s
215 :
212 :2010/11/21(日) 06:38:33
>>213 、214さん
回答ありがとうございます
>>214 さんのを参考に書いてみたのですが
やはりうまく行きません
書いたコードは以下の通りです
1 open(FILE,"IPTCP.txt");
2 while ( $message = <FILE>){ #ファイル関連
3 read FILE, $message, -s FILE;
4 if( $message =~ m/(.*Internet Protocol)(.*)(?=.*Transmission Control Protocol)/s){
print "$2\n";
}
}
print "処理完了\n";
同じパターンで書かれた文字列から、4に該当する文字列を摘出するので
while文を使っているのですが、3を入れる位置に困ってます
ここに入れてしまうと、繰り返すたびに読み込まれてしまうので、良くないと思うのですが
1の下では機能しませんでした
read文についても調べたのですが 「-s FILE」の修飾詞-sの意味など
わかりませんでした(おそらく、文字列を単一行として扱う?)
3を1,2に組み込んでみようかと思いましたがダメでした
このコードの結果として一番最後の3に当てはまる所だけ出力されました
216 :
212 :2010/11/21(日) 06:51:36
複数かよ open read while($mes =~/foo(.*?)bar/sg){ print $1; } ざっと keyword: ファイルテスト演算子
>>212 my $begin = qr/^Internet Protocol,/;
my $end = qr/^Transmission Control Protocol,/;
my @line;
open(FILE, 'foo.log') or die;
while(<FILE>){
if (/$begin/ ... /$end/){
push(@line, /$end/ ? "\n" : $_);
}
}
close FILE;
print @line;
use strict; use warnings; my $text; open(INFH, '<', 'test.txt'); read(INFH, $text, (-s INFH)); close(INFH); while($text =~ s/(Internet Protocol.*?)Transmission Control Protocol//s){ print $1; print "\n"; }
細かい所は自分で考えてもらうにしても while( <> ){ if ( /Internet Protocol/ .. /Transmission Control Protocol/ ) { print ; } } だけの事だろ。 # インデントは全角空白。注意
ああ、リロードしてから書けば良かった
なんでみんな難しく難しくコードを書こうとするの? 質問に対してワンライナーで無理やり書く必要も無いっしょw
ワンライナーが肌に染み付いているってことなんじゃないの 個人的使用が多いとそうなるんじゃ
コードゴルフのことをいいたいんだろうけど… これが難しいなら、質問者諸共webprogの初心者スレへ行け。
質問スレの回答にわざわざ変化球投げなくてもいいんじゃないの?って話しかと・・・
Perl使いじゃないのでROMってたけど範囲演算子が素敵すぎる
228 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/21(日) 15:42:38
難しく書くとこに美徳+優越感をえているバカどもばっかりだからな マイトガイの影響かしらないけど あとモダンとかわめいてるカスども
隔離スレに引っ込んでろよ。
ここまで文章から頭の悪さが感じられるような人って、ある意味凄いよね
>>228 優越感じゃなくて
単に肌に染み付いてるってことじゃないの?
難しく書こうとは思わないけど、 $temp を減らせる方法があるなら、そっちを選ぶことが多い
234 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/21(日) 16:52:05
マイトガイ信者必死・・・
マイトガイとかモダンとか一体何の話なの?
アニヲタ帰れ
dankogaiはいつになったら江川達也とフュージョンしてスーパーdankogaiになるん?
239 :
212 :2010/11/22(月) 00:05:27
>>217 〜221さん
アドバイスありがとうございました
完成しました
このコードの趣旨は
>>216 のテキスト(2G)を正規表現で
TCPヘッダー、IPヘッダー、UDPヘッダーで分けて
それからさらに各種ヘッダーの中身を一つ一つ
テキストに出力していくという内容でした
例
/→Source port.txt
TCPヘッダー.txt→→ Destination port.txt
\→Sequence number.txt
コレが完成したプログラムです
http://windyakin.if.land.to/src/up38_2361.zip しかし、未熟者が作ったので正規表現の部分が
全てwhile文の効率の悪いプログラムです
この様なコードの場合
どのようにすれば最適化できるでしょうか?
出力なのに INx っていうファイルハンドル名がきもちわるいですw 個人的にはだけど、親で開いたファイルハンドルに子が書き込むのはヤダなぁ
241 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/22(月) 00:27:45
マイトガイって ハンマーもって建物のRepairとかしてそうですね なんていうか敵に襲われたら ハンマー振り回して フンガフンガ!!いって倒したら そっこう建物にもどってRepairしてそうですね ドワーフですね
242 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/22(月) 00:28:45
マイトガイとダンコガイは別人です^^
243 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/22(月) 00:33:16
>>235 >>238 なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?
なるん?なるん?なるん?なるん?
なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?
なるん?なるん?なるん?なるん?
なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?
なるん?なるん?なるん?なるん?
なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?
なるん?なるん?なるん?なるん?
なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?なるん?なるん?なるん?なるん?
なるん?なるん?なるん?
なるん?なるん?なるん?なるん?
もうおまえコテハン捨てたほうがいいよ 目障りだし、カスだし、氏んだ方が世の中の為
こうゆうバカは罵詈雑言でも相手してくれる事に快感を覚えるから、 スルーするのが一番いいよ
246 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/22(月) 00:47:16
キムチ乙・・・
>>239 20個のopenと19個のcloseがなにか絶望的なふいんきを醸し出しているような……
>>239 似たような正規表現をまとめて引っ掛けて、分岐処理だろうね。
あと、openにエラートラップが無いと、
一部のログが取れてなくても気がつかないかもな。
250 :
デフォルトの名無しさん :2010/11/22(月) 18:42:43
以下で、0と出る理由が分らないんですが何故なんでしょうか? my @a = split(',', ''); print @a-0; ----- javascriptのように、''な要素が一つ出来上がると単に思っていたのでなかなか理解できずにいます・・。 alert(''.split(',').length);
え、どうみても正常に動作してますけど
むしろ空文字列を','でsplitしたら要素が1コできちゃう JavaScriptの仕様の方がよくわからない。 なんでそんな仕様なんだろう。
>>252 戻り値が配列
区切り文字が「何らかの文字が0個以上」
正常でしょ?
>>250 @a のみとやると配列の中身を見るだけ
@a - 0 とすると @a は $test=@a のように評価されることになって
配列の要素数から0を引けばその結果が返ってくるだけ
split の第一引数は 「区切りとなる文字」 ではなく 「区切りとなるパターン文字」 ですよん
微妙にアレなんで > Splits the string EXPR into a list of strings and returns that list. > By default, empty leading fields are preserved, and empty trailing ones are deleted. > (If all fields are empty, they are considered to be trailing.) print scalar split(/,/, ',a,,a'), "\n"; print scalar split(/,/, 'a,,,'), "\n"; # 後続するフィールドが空なら削除 print scalar split(/,/, ',,,'), "\n"; # 全部空なら全部削除
関数が多すぎで @EXPORT に列挙するのがめんどくさいけど簡素化できないもんでしょか?
259 :
デフォルトの名無しさん :2010/11/22(月) 21:37:22
>>256 ,257
ありがとうございます。
なんか難しいですね・・
split は第3パラメータに負の値を指定すると、後続の空要素を省略しなくなる。 print scalar split(/,/, "a,"), "\n"; →1 print scalar split(/,/, "a,", -1), "\n"; →2 しかし、空文字列は第3パラメータに負を指定してsplitしても要素数はやはり0。 print scalar split(/,/, "", -1), "\n"; →0 つまりperlの考え方では、空の文字列は何でどうsplitしても空の配列にしかならんということだな。 でもそれがperl的にはいろいろ処理する上で都合がいいし、合理的な仕様だと思う。
for my $symbol (keys %MyPackage::) { if (*{$MyPackage::{$symbol}}{CODE}) { push @EXPORT, $symbol; } } >258の件でこういうの考えたけど、処理順が上手くいかなくて、Dumperとかも拾っちゃった
Perlでいくつかのパッケージを作成し、それらを協調して動作させようとしています。 現在、最上位に位置するパッケージから下位のパッケージにオプションのハッシュを 渡して動作の調整を行っているのですが、環境変数でやってもいいかな、と思うぐらいの 全体的な設定値は、どのようにして扱えばよいでしょうか。 ずっと引数で設定値を引き回していくのも、まどろっこしいような気がします。 例えば、JavaのDIのように実行時に注入するような、そんなやり方や、 Perlではこうやるのが慣習、というのがあるのならば、教えて欲しいです。
環境変数でやってもいいかな、と思うぐらいの全体的な設定値で 処理中に変更されないんだったら もうグローバル変数でいいんじゃないんですかね。
262 じゃないんだけど、 my $TEST; って宣言して、これを下のスコープで同名の宣言を禁止する事って出来たりするのでしょか? my $test; testfunc(); exit; sub testfunc{ my $test; # <- エラーにしたい }
そもそも禁止したい理由がわからん…
グローバルとして使うときはmy?our?
>>266 値が変化しない前提ならどっちでもいいんでは
>>264 外側の$testにアクセスできなくなることを問題にしてるのなら
内側でmy $testをしたことが悪いんじゃなくて、
それでアクセスできなくなる作りが問題なんだと思う。
例えば$testを得るための関数を用意するとか、パッケージ変数にするとか。
あ〜 モジュールにしちゃうのもいいな グローバルでもローカルでも同じ名前を使うことが多くて、 たまに自分がボケて意図しない結果に頭を悩ますことがあるから 同じ名前はエラーにすれば楽チンかなぁって (^_^;)
お前がアホなだけじゃん
アホだから対策を考えてるんだけど・・・
対策wwww 真性かよ
ならいい方法あるぜw つ紙とペン
モジュールにしちゃえ
紙はまとめ終わったあとの清書にはとても有効な手段だが、 まとめ終わってない現在進行形のものをまとめるには有効な手段とは言えない。 それぐらいも分からないバカなの? 小学校からやりなおすの? あふぉと言われてる自分より下が居ることにびっくりした。
本当に自分より下なら、いちいちレスしたりしない
発 者 同 . 。_ ____ 争 生 同 .じ . /´ | (ゝ___) い .し 士 .レ .__/'r-┴<ゝi,,ノ ro、 は、 .な で .ベ ∠ゝ (ゝ.//` ./`| }⌒j .い し .ル } ⌒ /`ヽ、_∠l,ノ ・ヽ´ .! ! か の / ´..:.} >、、___, .r、 ソ、`\ / ..:.:.} / |∨ ` ̄ / ..:.:./ | 丶 / _、 ..:.:.:.{ .{.:.:. \ { ..:Y .ゝ、 {.:.:.:.:. ヽ |、 ..:/ 丿 .:〉 >.- ⌒ . ヽ / {. ..:./ ソ ..:./ .( ..:.:.:` ..:} ./..:.:}.:.:./ ヘ、 ..:./ .\ ..:.:r_,ノ、.:.:} ./..:.:/|.:/ {.:./ X.:.:}.} X X /..:.:/ .}.:| }:/ .Y丶ヽ Y.:Y . __/.:/ { } 《.〈、 _,,__>.:》丶 Y.:\ /.:.:.:.:.::/ !.:.:ゝ ゝ.:. ̄ヾ ´:.:.:.:.:.:.:.:.:ヾゝ \.: ̄>
本当にアホだわw
機械的にダブり宣言をチェックすると逆に同名の変数を使いづらくなって鬱陶しいと思う。 全ての変数名がダブらないってことは結果的にグローバル変数しか使えない言語と同じだし。 もっと、変数の命名ルールを工夫するとか、スコープ範囲を小さくまとめて 同じ名前の変数をブロック内で宣言したことを途中で忘れちゃわないようにするとか、 そういう方向で回避するよう心がけた方がいいんでは。
メインPCはDドライブがリカバリー用のドライブになっていて、そのためにCがシステムドライブ、Eがデータ用のドライブになっています。 それに合わせてサブのPCのドライブ構成を、Cがシステム、Eがデータ用にしていて、Dドライブは存在しません。 そのサブのPCにActivePerlをインストーラーでインストールしようとしたのですが、Invalid Drive: D:\ となってインストールできません。 どうしたら良いでしょうか。
バイナリをzipでダウンロードして、D:\Perlなりに解凍して、D:\Perl\binにpathを通す
>>282 ドライブ D: は存在しない、って書いてあるだろ。よく読め。
いや、普通に E: にインストールできるっしょ・・・
え、サブPCのドライブ C:に(普通に)インストールしようとしたら、 ActivePerlのインストーラに「D:\ が存在しないよ」とよくわからないエラーを出されちゃった、 という話ではないの?
インストール中に[browse]ってボタンが出てくるから、 押してドライブとディレクトリを設定してね。
287 :
280 :2010/11/24(水) 20:23:05
ちょっと用事で抜けるので、結果はまた後で書きますが、 Cドライブにインストールしたいのですが、インストーラーを起動させると、 その直後に前記のエラーが出て何もさせてもらえず終了する感じです。 zipによるインストールを試してみます。
288 :
Perl忍者 ◆M5ZWRnXOj6 :2010/11/24(水) 21:07:43
下を見ればやる気出る
以前は D にインストールしてて、設定が残ってるだけなんじゃないかなと・・・
290 :
280 :2010/11/24(水) 23:38:40
クリーンインストールなのでそれはない、と思ったんですが、 OSインストール時に色々ありまして、最初にCとDを作り、その後Cをまた再インストールしなおした後、DをEに変更するということをやったので、 もしかしてDの情報が残ってるのかな?と不安に思い、Eをフォーマットしました。 結果、インストーラーでインストール出来るようになりました。 でも、何でCドライブ内でのインストール作業でDドライブのチェックが最初に入ってるんだろう・・・ 結果的には良かったですが。
アリなGUIモジュールはなにですかね?
Perl/Tk
$hoge = (5 > 3) ? "true": "false"; print $hoge; #=>true print (5 > 3) ? "true": "false"; なぜか1が出力されてしまいました。 上はこれと同義だからという理由でした。 (print (5 > 3)) ? "true": "false"; なるほど・・・
3項演算子の優先順位に涙した!!
まてまて、それならなんで $hoge = (5 > 3) ? "true": "false";は ($hoge = (5 > 3)) ? "true": "false";と同義にならないんだ? 前方が代入処理だった場合は〜、とパーサが例外処理してるんだろうか。
printがエラーになったらfalseが表示されるんじゃなイカ?
>>297 単純な話。「=」の方が「?:」より優先順位が低いから。
>>299 のとおり。
1 + 2 * 3 が9ではなく7になるのとまあ理屈はおなじだ。
ついでに300get。
print 5 > 3 ? 'true' : 'false'; # true print (5 > 3 ? 'true' : 'false'); # true print ((5 > 3) ? 'true' : 'false'); # true 結合の強さをちゃんと覚えてないから「あら?」と思ったときは perlop のお世話になってる。
printの方が例外的な動きをしてるので、>299で読むのはここ >リスト演算子 (print() など) や単項演算子 (chdir() など) は、 すべて次のトークンとして開き括弧が続くと、 >その演算子と括弧内の引数は、 通常の関数呼び出しのようにもっとも高い優先順位として扱われます。
迷ったら括ればおk
あーでもないこーでもないと薀蓄合戦するくらいなら 括れ
>>303 だね〜w
括弧で括るのが癖になってきたら
if(($test eq '〜') || () || ()){
}
みたいに、括弧で括らなくていいとこまで括らない時がすまなくなった
別に「蘊蓄合戦」じゃないだろ より正しい詳しい知識を持っていた方がいいってだけのことじゃないの たとえば初心者向け入門書の説明によくある「おまじない」ってのを そのままずっと「オマジナイ」としてしか認識しないままだったら マトモな上達は到底望めない
Trick or Treat
Perlに限らないけど、他人のコード読むときに演算子の優先順位を知っておく必要があるよ。
=や==が複数回出てくる時はカッコをつける、が俺ルール
print()だけで考えてるから分からなくなる。 isString () とかの函数考えてみりゃわかる。 このときこうなる。 isString (x) ? "true" : "false" ; 関数の()のあとに?があって、これはもちろんisString()の判定結果を使うことを示している。 するとprint はただの命令のprint じゃなくて、括弧つきの関数のprintf()みたいな構文として解釈したほうが良い場合もある。 そうすればprint () と isString () の整合性を付けることができるし、 printに括弧をつけて?:を使った時の挙動の覚え方にも一貫性ができる。
>>310 良い場合も何も、Perl の print は元々項として扱える関数でしかないので、
PHP の echo のように言語構造に食い込んだ特別なものと捉える方がおかしい。
合言葉は、くくれカス
test("1回目",0); test("2回目",0); test("3回目",0); sub test { my $str =shift; my $flag=shift; my $last=""; print "初期化直後last:$last\n"; my $last = "hoge" if($flag); print "ifで代入後last:$last\n\n"; $last = $str; return 1; } このプログラム、どんな挙動をすると思いますか? 1時間ほどハマりました。バグでしょうか。
そんな時のための use warnings;
「perlsyn - Perl の文法」より
ttp://argrath.ub32.org/perldocjp/5.10.0/perlsyn.html > 注意: (my $x if ... のような) 条件構造やループ構造で修飾された my 文の振る舞いは
> *未定義*
> です。 my 変数の値は undef かも知れませんし、以前に代入された値かも知れませんし、
> その他の如何なる値の可能性もあります。 この値に依存してはいけません。
> perl の将来のバージョンでは現在のバージョンとは何か違うかも知れません。
> ここには厄介なものがいます。
おまけに同一スコープ内での二重定義だし。
まあバグはバグでもPerlのバグではなく
>>313 が書いたコードのバグですね。
そもそもキミが何をやりたいのか、どんな結果を望んでるのかわからない以上、 my $last = "hoge" if($flag); この行の my を除く以外は正常動作としかいえない。
と書いたものの、もしかして $last は、C でいうところの static な変数を希望してる感じ?
>>313 >思いますか?
じゃねーよ。
結論をきちんと書け。めんどくせえな。
my $last=""; これを外にだしておけ
my $last = "hoge" if($flag); はif($flag){my $last = "hoge";}と同じだ。
だから
>>313 の様に$flagが常に0の場合はこのブロックの中身が実行されることはない。
よって$lastには何の影響も与えないのでは?
>>320 use strict;
use warnings;
my $test = 1;
my $test = 5 if 0;
print $test;
実行すれば分かる。
>>320 変数スコープの解釈はコンパイル時に行われるから条件文には左右されない。
以下のように if 0 としてコンパイル時の最適化で文自体が消えるようにしても、
二度目の my 宣言の後では (Perl 5.12.2 では) state 宣言された変数のような挙動を示す。
use strict;
use warnings;
sub foo {
my($bar, $baz, $flag) = @_; print "1: bar[$bar] baz[$baz]\n";
my $bar if 0; $bar ||= 'BAR?'; print "2: bar[$bar] baz[$baz]\n";
my $baz if $flag; $baz ||= 'BAZ?'; print "3: bar[$bar] baz[$baz]\n";
tr/?/!/ for $bar, $baz;
}
foo(3,4); foo(5,6); # print "4: bar[$bar] baz[$baz]\n";
>>313 ,315
初期化直後last:
ifで代入後last:
初期化直後last:
ifで代入後last:
初期化直後last:
ifで代入後last:
普通にこういう出力じゃねーの、と思ったが違うのか。これは微妙。
後置ifが偽でもそのステートメントが影響を及ぼす事があるんだな。
いやいや、及ぼしちゃ駄目だろ。
328 :
デフォルトの名無しさん :2010/11/30(火) 17:26:29
どなたかperlでTwitterAPI動かしていませんか?昨日から検索機能が急にうまくうごかなくなったのですが、そのような現象に心当たりありますか?
>>313 もうちょっと奇怪にしてみたよ。
>>315 の通り未定義なんだろうけど…。
use strict;
use warnings;
test("1回目");
test("2回目");
test("3回目");
exit;
sub test {
my $str = shift;
my $flag;
my $last if ($flag);
print "last:", ($last || ''), "\n";
$last = $str;
}
あいmyな動作だねぇ
結局何が言いたいorやりたいんだ?
me too
未定義な動作ってのに初めて出会ってはしゃいでるんだろ。 生暖かく見守ってやろうぜ。
335 :
330 :2010/11/30(火) 19:00:05
ああ、私は
>>313 と別人ね。
これはエラーで検出していいレベルだけど、なんで放置されるんだろうね。
クス
337 :
330 :2010/11/30(火) 19:10:51
一応perlcriticで検出可能。マンドクセ。
perl 5.12.2 使ってるだども、5.10 のリポジトリって使っていいのかしら? モジュールをインストールするときは ppm は ppm で、とか CPAN は CPAN で片方に統一とかしなくていいんですよね?
>>313 > my $last = "hoge" if($flag);
偽判定だから、代入されるワケがない。
if (defined $flag)なら、0でも空文字でも真判定されるよ。
思わぬ動作ではあるだろうけど、そもそもコードが論外レベルに寝とぼけてる。
代入されるワケがないのに代入されるって話でしょ
javaのnative2asciiのような処理をしたいのですが 漢字を \uXXXX 形式には変換でしました。 s/([\x{0080}-\x{FFFF}])/sprintf '\\u%04x',ord($1)/eg; 結果 "▼" ⇒ "\u25bc" この逆がどうもうまく逝きません。 期待する結果 "\u25bc" ⇒ "▼" 自分で書いてみたコード s/\\[uU]([0-9A-fa-f]{4})/chr(0x$1)/eg; s/\\[uU]([0-9A-fa-f]{4})/chr('0x'.$1)/eg; s/\\[uU]([0-9A-fa-f]{4})/\x{$1}/eg; ぜんぶダメです。玉砕です。助けてください。
s/\\[uU]([0-9A-Fa-f]{4})/chr(oct('0x'.$1))/eg;
343 :
341 :2010/12/02(木) 16:06:53
の
s/\\u([\da-f]{4})/chr(eval("0x$1"))/ieg;
補足、
>>345 は他の方法も提示してみた、というか作ってみただけ。
evalは遅いらしいのでなるべくなら使わん方がええかも。
うん
Benchmark: timing 100000 iterations of 342, 345... 342: 0 wallclock secs ( 0.32 usr + 0.00 sys = 0.32 CPU) @ 312500.00/s (n=100000) (warning: too few iterations for a reliable count) 345: 2 wallclock secs ( 1.47 usr + 0.00 sys = 1.47 CPU) @ 68027.21/s (n=100000) うん
でもevalはコード自動生成という夢を与えてくれる!
まあ覚えといて損はないよね eval 最後の手段にとっておくべきだろうけど
351 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/02(木) 19:56:12
evalはどういうときに使うでしょう 答えられないやつは、ダメです
てぴてぴてっぴー
353 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/02(木) 19:59:35
答えられないのですか
354 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/02(木) 20:00:21
早く誰か答えてみてください わからないんですか?・・・
フッ…貴様とここで会うとは
356 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/02(木) 20:03:35
久しぶりだな 進捗状況はどうだ
何この流れ
358 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/02(木) 20:06:29
お前とはあの、夜の繁華街の裏路地以来だな 絡まれてた派遣社員を、助けてたなお前は 見てたぜあのとき 絡んでた3人のプログラマーに 「・・・やめないか、土方。」 と言って 「図解プログラミング PHP+MySQL裏拳!」 を噛ましてたあのすごさ なかなかやるよな君も 最後は 「持っててよかった、基礎からのMySQL。」 と捨て台詞はいてさっていったが
今週もぽっちで寂しかった。まで読んだ。 最近こいつの電波文を解読できるようになってきた自分が怖いw
tune a fishって 魚に芸を仕込む 魚を躾する という日本語訳でいいのかね?
たしかエキスパートCプログラミングでは「魚を飼いならす」と訳してた
www:mechnizeを使っているのですが
下記のようなリンクをクリックするにはどうやったらいいのでしょうか?
<img src="
http://xxx/xxx.gif " onclick="xxxxxxxx()">
CGIゲームを運営してるものです 処理の動作が多いとこだけ軽くさせるためにPHP化させたいんだけど DBの受け渡しさえできればCGIとPHPと混合させても動きますか? 混合させてる人とかいますか?
PHP化しさえすれば軽くなると思ったら大間違い カモヨ
まずはCore i7にしてみる。
mod_perlで高速化させればいいだろ
後スレ違い
>>1 嫁
今気付いた。 CGIはWebProgに行けとは書いてあるが、mod_perlについては書かれてないんだなw
wperlなのに黒い窓が一瞬出るのは何だろう
この後、空白行を削除したいのですがどうしたらいいですか? @line =<>;
@line = grep(!/^\n/,@line);
てきとーに @line = grep{!/^$/} @line; といってみる
>>370 ,371
grep ってそうやって使うんですか。勉強になりました。
これでもOKですか?
@line = grep(!/^(\s| )*\n/,@line);
スペースだけの行も削除したいのならそっちだね…といいかけたが 全角空白?それエスケープしなくて通るのかな?
@line = grep(!/^[ ]*\n/,@line);
use utf8 してて \t 残すのかどうかは質問者さんしか知らない。
たしかにおかしいなw
誤爆…
378 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 11:35:36
Core-i7にすればすべて解決する
新しいPCに変えたのかな?
>>378 Corei7買ったんだね!おめでとう!
381 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 12:04:00
Perlのために HD2TB Coreーi7 NVIDA GTX460にしました 作業効率が5000%向上しました
382 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 12:04:58
僕が書いた50ステップぐらいのプログラムが早くなりました
50ステップw
384 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 19:19:33
385 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 19:31:51
lwpの方確認してませんでしたできそうです^^w
386 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 19:32:49
IO::All::LWP uaで解決しました ありがとうございましたm(-_-)m
独り言がTwitterでどうぞ。
UserAgentってことはhttpとかなんだろうけどそれはIO::All::LWPにお任せ なので、そっちのマニュアル調べればいいんじゃないか。
389 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 20:31:47
390 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 20:32:59
9時からオンラインゲームをやりたいので 早く教えてください
あと三十分か… 誰も教えるなよ
392 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 20:44:44
頼む教えてくれ 既にIO::Allのgetlineでタイトル取得のスクリプトかいてあって LWP::UserAgentのほうで書き直したくないんです だから$io->getlineのほうでUserAgent変える方法教えてください 2chの題名が 「ようこそボボンハウスへ」になってしまうからかえたいです 早くしてクレー
393 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 21:00:24
後で教えてください
394 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 21:27:27
はぁ
395 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 21:36:58
#!/usr/bin/perl
use strict;
use IO::All;
use IO::All::LWP;
use
HTTP::Request::Common; my $ua=io('
http://192.168.1.2/a ');
$ua->ua('yahoo');
print $ua->getline;
libwww-perl/5.834のままです
教えてください
何が悪いんですか
ua
Set or get the user agent object (LWP::UserAgent or a subclass).
If called with a list, the list is passed to LWP::UserAgent->new.
If called with an object, the object is used directly as the user agent. Note that there is a default user agent if no user agent is specified.
って書いてありますが
396 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 21:40:22
うおおおおおおおおおおおおO!
きたああああああああああああああああああ!
#!/usr/bin/perl
use strict;
use IO::All;
use IO::All::LWP;
use
HTTP::Request::Common; my $k=new LWP::UserAgent;
$k->agent('yahoo');
my $ua=io('
http://192.168.1.2/a ');
$ua->ua($k);
print $ua->getline;
でできました
uaにlwqに設定したagentを渡せば
設定されました
キターーー
397 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/05(日) 21:41:21
41分の遅延ですがネトゲはじめます
ファイル名が特定の文字列で始まるファイルを読み込みたいのですが ファイル名指定に正規表現が使えない?様で上手くいきません 何か方法は無いでしょうか
普通globで用が足りるだろ。
@files = grep { /PATTERN/ } readdir $dir; # opendir とか略 こういうのじゃダメなの?open my $fh, '<', '^abc\d{8}.+$' とかするとそりゃコケる。
>>398 正規表現が使えないというのは文字コードが原因か?
というかそのコードを出さないと何もわからないよ?
402 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/06(月) 19:14:50
globじゃ正規表現つかえねえよこら 400みたいにやれこら
>>398 globに与えるのは正規表現とは違う。
glob("/path/to/特定の文字列*")でOK。
戻り値に対して
>>400 のようにgrep掛けてそう言ってるのならフルパスになってるとか。
globはファイル名やpathにスペースが入ってるとうまくいかないのでちうい
405 :
デフォルトの名無しさん :2010/12/07(火) 05:00:36
perldocってなんて読むのかな。 いつも「ぱーるどっく」って読んでるけど不安。
他にどんな読み方があるかなあ
脳内だと「ぱるどく」だったりする。
パール犬
409 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/07(火) 14:05:04
普通に パールドック げは
410 :
デフォルトの名無しさん :2010/12/07(火) 20:50:33
X11::Protocolをfindだけしてみたのですが、Cのプログラムが見当たりません。 xlibは使っていない? ひょっとしてPerlが直接Xプロトコルを話している!? ソース嫁とか、今は言わないでください。 でも、Perlが直接Xプロトコルを話しているなら、本気で読みます。
411 :
410 :2010/12/07(火) 21:11:40
ほぼ自己解決しました。間違えていたら教えてください。 grep IO::Socket `find`したら、X11::Protocol::Connection::Socketがこれをuseしていることがわかりました。 よく考えればX11::Protocolという名前もそれっぽいし、xlibには依存していないみたいですね。 素敵です。生のXって、APIじゃなくてプロトコルなんですね。 The X-Windows Disasterなんてさんざんなことを言われていますが、 この基本設計は素晴らしいし、それをそのまま生かした(と思われる)X11::Protocolの作者も偉い。
$test{'1'} = 'a'; $test{'2'} = 'a'; $test{'10'} = 'a'; $test{'11'} = 'a'; sort(keys(%test)); こうしたときの結果が 1 10 11 2 ってなるんですが、これを 1 2 10 11 とソートするにはどうすれば。。。 sort { int() <=> int() } みたいにするしか無いんでしょか?
sort { $a <=> $b } keys %test
そのエラーメッセージ中学生レベルの英語だろ
mozreplが動いてないんじゃないの?4242
>>416 でもこれだけでエラーになるものですか?
my $mech = WWW::Mechanize::Firefox->new();
誰か416のコードを動かして報告ください。
mozreplは動いていますか?
>>419 firefoxの拡張なのですか?
capanにあったMozreplのことだと思っていました。
今インストールしました。
https://github.com/bard/mozrepl/wiki/ firefoxを起動し、ツール - Mozrepl - start しました。
次にコマンドプロンプトから
telnet localhost 4242
しました。しかし、一つキーを押すだけで挙動不審なコマンドプロンプトになってしまいました。
とても使えそうなものではありません。
cygwinからtelnet localhost 4242としても反応なし。
ここでもう一回実行してみたらエラーが変わりました。(test1207.plは
>>414 のコード)
$ perl test1207.pl "yahoo.co.jp" yahoo.png
command timed-out at /usr/lib/perl5/site_perl/5.10/MozRepl/Client.pm line 186
www.yahoo.co.jp な
>>421 両方ともダメでした。
$ perl test1207.pl "www.yahoo.co.jp" yahoo.png
command timed-out at /usr/lib/perl5/site_perl/5.10/MozRepl/Client.pm line 186
$ perl test1207.pl "
http://www.yahoo.co.jp " yahoo.png
command timed-out at /usr/lib/perl5/site_perl/5.10/MozRepl/Client.pm line 186
perl が外に行くのをファイヤーウォールで遮断されてるとかは?
ダメでしたってwwwwwww どこをどうやってみたけどダメだったぐらい書けよw お前が良しと思ってるやり方がダメかもしんないでしょ?
一言 「ファイヤーウォールは無効にしても駄目でした」 で済むだろ?どんだけゆとりなの?バカなの?
428 :
デフォルトの名無しさん :2010/12/11(土) 21:08:07
何でそんなに喧嘩腰なのお前ら
ファイヤーフォールの遮断なんてコンセント付けてあるかどうか確認する次元だろ。 どうだめとかあるのか?
iptablesの設定はちゃんとやったのか?と聞くとちゃんとやったと言うが、 結局つながらん原因はそれ、とかあまりにありふれた事態。
ダメでした
432 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/11(土) 23:14:22
なんでこんな低脳なの?
もう無視しろよw
mozreplはlocalhostにつなぐ
>>414 んだからファイアーウォール云々はあまりにも的を得ていない
perl忍者の方がマシなレベル
やってみた。どうやらCygwin上からだと失敗するみたいだ。 原因は MozRepl::Client.pm 0.03。 /usr/lib/perl5/site_perl/5.10/MozRepl/Client.pm の 183〜184行目に > ### adhoc > $command = join(" ", split(/\n/, $command)) if ($^O eq "cygwin"); というのがあるが、この184行目を無効にすると、サンプルコードもうまく動くようになった。 なんで作者がこんな「adhoc」なコードを入れたのかはよくわかりません。なんでだろうね…。
いやいや、「english」を文章に「insert」すると超「cool」だねえ!
× english ○ English
○Ingurisshu
cygwin とか初めて出す情報だね キュフフ
442 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/12(日) 10:11:33
数ヶ月前の発言みると 自分こんな究極に痛い発言してたの?すげえ痛い!って思うことあるよな
特にお前。
「忍者」名乗ってる奴ら、忍者の意味わかってんのか。 忍者なら忍者らしく、なるべく目立たないようじっと忍んでろ。
忍者たるものギンギラギンにさりげなく、だな
449 :
177 :2010/12/13(月) 12:09:39
>>184 どうもありがとうございます。
utf8で解釈できないヘンなデータにも
文句を言わなくなりました。
readじゃなくてopenのときに設定する
必要があることがわからなくて、ちょっと
ひっかかりましたが、それ以外はうまく
いきました。
ちなみに、STOP_AT_PARTIALって
どんなフラグですか?
ぐぐってもEncode.pmを読んでも、
ヒントさえ見つかりません。orz
450 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/13(月) 16:53:30
あの質問なんですが 444のレスが なんで自演ってわかったか教えてください
あるかどうか分からない@arrayと要素数の多い@array2があります。
@arrayがあれば@arrayをforeach、なければ@array2をforeachさせたくこういうコードを書きました。
foreach (@array || @array2) {処理;}
その結果、@arrayがない場合はうまく@array2がforeachされたのですが、ある場合には@arrayの要素数が返ってしまいました。
なぜ@arrayがない場合はうまく動くのにある場合はこうなってしまうのでしょうか?
||の仕様で、前方の配列が真だった場合はスカラーとして返し、後方の配列が真だった場合は配列として返す、となっているのでしょうか。
その仮定が正しいのかどうか、こういう風に書いて試してみました。
foreach ((@array && (0 || @array)) || @array2) {処理;}
しかし結果は変わりませんでした。
また、どのように書くのがスマートでしょうか?
今はこのようにしているのですが、参照を取って復元というのはやや微妙です(@array2は実際の所keys %hashです)
my $ref = (@array && \@array) || [keys %hash];
foreach (@$ref) {処理;}
452 :デフォルトの名無しさん [sage] :2010/12/13(月) 17:37:13
>>451 http://perldoc.jp/docs/perl/5.6.1/perlop.pod |代入のために二つの集合を選択するためには使うべきではない
|@a = @b || @c; # this is wrong
|@a = scalar(@b) || @c; # really meant this
|@a = @b ? @b : @c; # this works fine, though
453 :デフォルトの名無しさん [sage] :2010/12/13(月) 17:37:14
>>452 配列の選択に||を使えう事は出来ず、?を使えば良いのですね。
@arrayと2回書くのは多少あれですが
foreach (@array? @array: keys %hash) {処理;}
とすることにしました。レスありがとうございました。
∩___∩ | | ノ\ ヽ | / ●゛ ● | | | ∪ ( _●_) ミ j 彡、 |∪| | J / ∩ノ ⊃ ヽ ( \ / _ノ | | .\ “ /__| | \ /___ /
453 :
デフォルトの名無しさん :2010/12/13(月) 18:17:19
BashのBrace Expansionが便利でしかも速いのでよく使ってるんだけど これをPerlで簡単に真似ることは出来ますか?
454 :
デフォルトの名無しさん :2010/12/13(月) 18:19:37
CGI::Application なんてものがあるんですね。 ------- プログラミングPerl vol1,2 Perlベストプラクティス オブジェクト指向Perlマスターコース ------- を読破したのに知らなかったよー(泣) なんて思いをさっきしたんですが、他にも「これ知っとくといいよ」ってありますか?
456 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/13(月) 19:26:05
読破してるのにしらないとは 相当ごみだろ おれよりごみじゃん おれよりごみなやつはほんとに終わってるとおもう ごみより終わってるってことは ほんとにそうおもうよ
>>454 CPANの人気モジュールランキングみたいなページがどこかにあったから探してみるといいかも。
正確にはレポートされたテスト数でのランキングみたいな感じだったと思う。
URLが見つからない…
458 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/13(月) 19:36:47
これだからWEBの立ち回りがへたくそなやつは
459 :
デフォルトの名無しさん :2010/12/13(月) 19:59:44
ごみですね。いくらperlについて勉強したって、結局のところ あまり意味がない。
460 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/13(月) 20:20:28
くそなやつほど マジにならずヘラヘラしたり 意味がないとかいいますよね
>>455 globで出来るんですね初めて知りました
ただ速度がBashに比べて少し遅かったです
$ time perl -e '@A=<110001001110001101{0,1}{0,1}{0,1}{0010000101{0,1},101000010{0,1}{0,1}}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}0000{0,1}{100,0{0,1}{0,1}}>;'
real 0m31.527s
user 0m3.853s
sys 0m25.817s
$ time echo 110001001110001101{0,1}{0,1}{0,1}{0010000101{0,1},101000010{0,1}{0,1}}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}0000{0,1}{100,0{0,1}{0,1}} > /dev/null
real 0m4.876s
user 0m4.492s
sys 0m0.047s
cygwin CelM 1.86GHz 2GB
速いパソコンだとこれが一瞬で終わるのかな?
>>461 sysで時間食ってるのでシステムコールトレースしてみたけどperlは
展開して得られた名前でいちいちファイルの存在確認をしてるんだな。
bashはそんなことはしないみたい。有無で結果が変わるってわけでも
ないので無駄な処理のような気がするけどなんでだろう。
CPANのString::Glob::Permuteは文字列操作だけなのでいいかも?
>>462 String::Glob::Permuteいいですね。ありがとうございました。Bashにかなり近いところまで速くなりました。
ひとつ残念なのはブレースのネストが上手く展開されない点ですが、ここはPerlでプログラムして補うべきでしょうか
$ BRACEEXP='{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}{0,1}'
$ time eval $BRACEEXP 2>/dev/null
real 0m20.161s
user 0m18.455s
sys 0m0.296s
$ time perl -e 'use String::Glob::Permute qw(string_glob_permute);@_=string_glob_permute($ARGV[0])' $BRACEEXP
real 0m30.391s
user 0m27.846s
sys 0m0.280s
>>449 バイト列をutf8で解釈しようとしたとき、おかしな場合に中断するものだと思ってたけど、
試してるうちに、わからなくなってきた。
Encode::utf8::decode_xsやEncode::utf8::decode_xsが呼び出してる
process_utf8が使ってる(ソースファイルはEncode.xs)。
465 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/14(火) 13:17:07
だれかテーブル設計してくれ
/|\ | | | ──‐ ./ ̄| ̄ヽ │ | │ | 人 (____ ヽ_丿 ノ / \
467 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/14(火) 17:35:33
なんてかいてあんだ こxx↑
こすぎ
469 :
デフォルトの名無しさん :2010/12/14(火) 23:20:36
Perlで日本語文字列の先頭2文字を取得したいです。 この書き方でEUCの場合は、うまくいくのですが、UTF-8の場合はうまく処理できずに 2文字目が文字化けを起こします。 my @list = split(//,$text); $text = $list[0] . $list[1]. $list[2] . $list[3]; 漢字コードがUTF-8の場合にはどうかけばいいのでしょうか?
use utf8してsubstrで最初から二文字指定すればいいだろ
471 :
デフォルトの名無しさん :2010/12/14(火) 23:22:40
すみません、 $text = $list[0] . $list[1]. $list[2] . $list[3] . $list[4]. $list[5]; でうまくいきました。
それたまたまうまくいっただけ。utf8で必ずしも1文字が3バイトに エンコードされるとは限らないのでそれではうまくいかない場合も ある。ふつうdecodeしてからsubstrだろ。
473 :
デフォルトの名無しさん :2010/12/15(水) 18:52:27
>>471 の処理はまずいのでsubstrを使うようにします。
あと、今まで文字列はEUCで、全角半角変換を下のようにjcode.plを使ってやっていたのですが、
&jcode::tr(\$my_name, '0-9A-Za-z−' , '0-9A-Za-z-');
UTF-8だと、下のように直接書いてもかまわない。つまり、Jcodeは必要ないということでいいんでしょうか?
$my_name =~ tr/0-9A-Za-z−/0-9A-Za-z-/;
$my_name = encode('utf-8', $my_name);
配列の要素をキーとして要素は存在しないハッシュを作るにはどうすればよいですか?
>>474 @hash{@array} = ();
>>475 エスパーあらわる!
つか、それが期待通りなのか?
>>477 そんなにエスパーか?
keyだけあってvalueがないハッシュのことだろ?
% じゃなくて @ だが・・・
サカナくんのニュースを見ながらなんとなく書いてみたら動いたので貼り付けw use strict; use warnings; my @array = qw(a b c d e); my %hash = ( @array => [] ); print defined($hash{'e'}) ? ref($hash{'e'}) . "\n" : "not defined\n"; print defined($hash{'f'}) ? ref($hash{'f'}) . "\n" : "not defined\n";
>>473 そうそう。そういうこと。
ちなみにJcode使ってるならjsubstrとかjfoldでも先頭2文字の切り出しはできてたはず。
コピペで my @hash{@array} = (); ってやってもエラー出んじゃん。 と思ったら @array が未定義でした。 ごめんなさいw
perlfaq4
http://perldoc.jp/docs/perl/5.10.0/perlfaq4.pod How can I remove duplicate elements from a list or array?
> my %hash = map { $_, 1 } @array;
> # or a hash slice: @hash{ @array } = ();
> # or a foreach: $hash{$_} = 1 foreach ( @array );
uniqの作り方のfaqに回答が載ってるってのは、おもしろいね。
私はmap派。
>>484 ハッシュスライスでググるといいよ。
486 :
デフォルトの名無しさん :2010/12/16(木) 20:44:43
perlは使ってる参考書によってコードの出来が違ってきそう(笑)
perlは使ってる脳みそによってコードの出来が違ってきそう()
それらはどの言語の本でも一緒だな
そこでpythonですよ
Ruby!
やり方はひとつじゃない
ワード用の文字もしくは終端 を正規表現で表すにはどうすればいいですか? [\w$]だと終端がマッチしてくれなくて。
ワード用の文字って何だ? マイクロソフトワードか?
いや単語用の文字ということでw \wで表される文字全部という意味で使ってます。
何言いたいのかさっぱりわからんけど.$じゃだめなのか
\w\n$ にしたらマッチした……とかいうオチじゃないだろうな
具体例をあげると abc[\w$] としたときに "abc(終端)" や "abcd" などはマッチして欲しいけど "abc[" や "abc#" など\wで表せない文字が後ろにつくパターンは弾きたいということです。 しかし実際には[\w$]と書いたのでは "abcd"にはマッチしてくれるけど"abc(終端)"のパターンがマッチしてくれないので どう書けばいいのだろう?という質問でした。
貴方の言う終端とは何ですか?
もう、ゴールしてもいいよね abc\w?$
>>498 改行もなにもない文字列の終端を意味しています。
>>499 それです!
ありがとうございました><
$は文字じゃないから[ ]の中に入れても無視されるという理解でいいんでしょうか。
というより [ ] の内と外では解釈の仕方がまったく異なるということ /abc$/ なら $ は行末だけど /abc[$]/ なら $ は $ そのもの
[] で括っても、クセでエスケープしちゃう
\b を避けてるのか?
507 :
デフォルトの名無しさん :2010/12/17(金) 10:26:40
JavaScript だと \b が日本語と英字で解釈が違う場合があって怖いんだけど、 perlでは問題ない?
utf8フラグ付きで、行末改行含まず、v5.10.1以降なら
/abc\p{PerlWord}?\z/
>>507 kwsk
509 :
デフォルトの名無しさん :2010/12/17(金) 14:42:01
こんな間違いをしたことがある(js)。 alert([ '---', 'jpan jp en'.match(/jp\b/), '日本 日 英'.match(/日\b/), '---' ]);
>>509 \bは、\wと\Wの間にマッチする。
'p'は\wにマッチするが、'日'は\wにマッチしない(\Wにマッチする)。
スペースは\Wにマッチする。
以上の理由だね。
perlは、use utf-8;すると、漢字は\wにマッチするので大丈夫。
511 :
デフォルトの名無しさん :2010/12/17(金) 22:49:36
Perlの処理で質問です. 以下のようなdatファイルを読み込み, 右側の数値が同じ場合,左側の数値をすべて足して(グループ化して) 出力する,といった処理がしたいのですが, どのようにすればいいのでしょうか? --1st_out.dat-- 7 12 10 12 12 12 10 12 9 12 9 12 6 12 6 12 11 13 9 13 12 13 11 13 10 14 10 14 15 14 12 14 7 14 希望する出力結果 69 12 43 13 54 14
まずsplitを使います ↓
次にハッシュでまとめます <終わり>
twitterのハッシュタグはどこらへんがハッシュなんだ?
515 :
デフォルトの名無しさん :2010/12/17(金) 23:38:15
516 :
デフォルトの名無しさん :2010/12/17(金) 23:38:24
517 :
デフォルトの名無しさん :2010/12/17(金) 23:50:03
my %h = (); foreach(split(/\r?\n/, $data)){ my($k,$v) = split(/ +/, $_); $h{$v} += $k-0; } foreach(sort {$a-$b} keys %h){ print "$h{$_} $_\n"; }
open (FH , "dat.txt" ) ; while (<FH>) { chomp ; @a = split / /; $h{$a[1]} += $a[0] ; } close (FH) ; print %h ;
519 :
デフォルトの名無しさん :2010/12/17(金) 23:54:44
my %h = (); while($data =~ /(\d+) (\d+)/g){ $h{$2} += $1-0; } for(sort {$a-$b} keys %h){ print "$h{$_} $_\n"; }
520 :
512 :2010/12/17(金) 23:54:52
>>515 こういったコードを書きゃいいんだ!!
1st_out.datは適当にdat.txtとかなってる!
chompとかsplitとかの引数の省略がわかりゃ初心者脱出だ!
print %hは良く見てみればお望みの出力になってる!
出力ぐらいは自分でやれ!
521 :
512 :2010/12/17(金) 23:56:59
間違った!
こういうコードってのは
>>518 みたいなまるでクズのようなコードだ!
ハッシュをまとめるってのは
$h{$a[1]} += $a[0] ;
だ!
そんくらいは理解してくれ!
何の統計か知らんか卒論落とすな!
522 :
デフォルトの名無しさん :2010/12/17(金) 23:57:29
あ、-0 要らないんだった。
どれが正しいのか分からんぞw
>>520 ありがとうございます.
でもこんな出力結果がでました.
211332610117914810142712253188346942352134316874410025422796508528424072411051269478614541589207349934511524844310619103
525 :
512 :2010/12/18(土) 00:06:58
一番ただしいのはオレだ! ファイル名も直したぞ! コピペでいけるぞ! print のとこは自分で工夫しろ! open (FH , "1st_out.dat" ) ; while (<FH>) { chomp ; @a = split / /; $h{$a[1]} += $a[0] ; } close (FH) ; print %h ;
526 :
512 :2010/12/18(土) 00:09:32
>>524 それは
print %h;
の部分が悪いんだ!
そこ改良すればちゃんと意味が通るはずだ!
他の人のforeachでの出力を参考にしてくれ!
>>517 >>519 改行やらが無いのが俺の手抜きだ!
もう寝る!!!!
527 :
デフォルトの名無しさん :2010/12/18(土) 00:13:15
528 :
デフォルトの名無しさん :2010/12/18(土) 00:16:26
もっと奇抜なコードを書いてくれ
ワンライナーまだー
>>527 open (FH , "1st_out.dat" ) ;
while (<FH>)
{
chomp ;
@a = split / /;
$h{$a[1]} += $a[0] ;
}
close (FH) ;
foreach $k (sort {$a-$b}keys(%h)){
print "$k $h{$k}\n";
}
531 :
デフォルトの名無しさん :2010/12/18(土) 00:48:38
みなさま,ありがとうございます.
>>511 の望み通りの出力結果を得ることができました.
ちなみに,以下のファイルの場合も同じことはできるのでしょうか?
--2nd_out.dat--
7 12 ワンピース
10 12 ワンピース
12 12 ワンピース
10 12 ワンピース
9 12 ワンピース
9 12 ワンピース
6 12 ワンピース
6 12 ワンピース
11 13 ナルト
9 13 ナルト
12 13 ナルト
11 13 ナルト
10 14 ブリーチ
10 14 ブリーチ
15 14 ブリーチ
12 14 ブリーチ
7 14 ブリーチ
希望する出力結果
69 12 ワンピース
43 13 ナルト
54 14 ブリーチ
mt %h; open (my $fh ,">","1st_out.dat" ) ; while (<$fh>) { chomp ; @foo = split / /; $h{"$foo[1] $foo[2]"} += $foo[0] ; } close ($fh) ; print %h ;
最初typoした myね
>>529 $ perl -lane '$h{$F[1]}+=$F[0];END{print "$h{$_} $_"foreach(sort{$a-$b}keys%h)}' 1st_out.dat
69 12
43 13
54 14
536 :
デフォルトの名無しさん :2010/12/18(土) 01:15:11
>>532 ありがとうございます.
これでバイト先の漫画管理がかなり楽になります!
>>535 あー、マジだ
横になりながらコード書いちゃいかんね
データによっては期待通りにならないと思うが、お手軽に $ perl -lane '$h{"$F[1] $F[2]"}+=$F[0];END{print "$h{$_} $_"foreach(sort{$a cmp $b}keys%h)}' 2nd_out.dat 69 12 ワンピース 43 13 ナルト 54 14 ブリーチ 2カラム目でちゃんとソートするならこんな感じ? $ perl -lane '$h{$F[1]}+=$F[0];$n{$F[1]}=$F[2];END{print "$h{$_} $_ $n{$_}"foreach(sort{$a-$b}keys%h)}' 2nd_out.dat 69 12 ワンピース 43 13 ナルト 54 14 ブリーチ
539 :
デフォルトの名無しさん :2010/12/18(土) 01:24:17
>>521 がちょっと気になったんだけど、今でも大学で perl 教えるところあるの?
540 :
529 :2010/12/18(土) 01:31:59
>>534 一行兄貴サンクス
変数宣言と数値への型変換が不要なPerlはやっぱりワンライナーに強いね
perlスレで言うのもなんだが、こういうのはawkの仕事じゃないのか。 awk '{cnt[$2]+=$1}END{for (x in cnt){print x,cnt[x]}}'
542 :
デフォルトの名無しさん :2010/12/18(土) 01:54:26
そうかな?
どっちでも構わんだろべつに
>>539 俺の大学ではさわりだけやった
大学の講義で使う言語=教授が使ってる言語みたいなもんだから学校によってまちまちだろう
545 :
デフォルトの名無しさん :2010/12/18(土) 13:50:33
$source に何行記述されているのかを調べようと my $len = scalar(split("\n", $source)); (scalarは一応明示的に書いただけなので無くても) このようにやったのですが、以下のように怒られてしまいました。 Use of implicit split to @_ is deprecated at ./a 何か良い方法はないでしょうか?
#!/usr/bin/perl my $source = "aaa bbb ccc "; my $i = $source =~ s/\n/\n/g; print $i . "\n";
my $len = $source =~tr/\n//;
ありがとうございます。 でも、改行が最後にあるとは限らないのです。 ちょっと考えて、以下の2つを思いついたんですが、 ----------------- my $len = eval{ my @a=split(/\r?\n/, $source) }; my $len = sub{ my @a=split(/\r?\n/, $source) }->(); ----------------- ちょっとダメダメな感じですね・・。 なにかいい案ないでしょうか?
#!/usr/bin/perl #my $source = "aaa #bbb \n #ccc #"; my $source = "aaa bbb \n ccc"; my $i = $source =~ s/\n/\n/g; $i += $source =! /\Z/ eq "\n" ? 1 : 0; print $i . "\n";
あっ。できました。たぶんこれで my $len = grep(/./, split(/\r?\n/, $source)); my $len = map { 1 } split(/\r?\n/, $source);
my $len = scalar(my @h=(split("\n", $source))); 強引だけど
間違えたじゃなイカ? #!/usr/bin/perl #my $source = "aaa #bbb \n #ccc #"; my $source = "aaa bbb \n ccc"; my $i = $source =~ s/\n/\n/g; #my $i = $source =~ tr/\n/\n/; $i += $source =! /\Z/ eq "\n" ? 0 : 1; print $i . "\n";
index関数が-1返すまで回った回数をカウントするとか
フツーに my $len = split /\n/, $source; で行数が取れると思うんだが…? 試してみたけど > Use of implicit split to @_ is deprecated at ./a なんて出なかったよ?
こういう時に限って忍者も出てこないな。
野郎は有益なことは何も書けないんだから出てくる必要なし
> In scalar context, returns the number of fields found and splits
> into the @_ array. Use of split in scalar context is deprecated,
> however, because it clobbers your subroutine arguments.
my $len = @_ = split /\n/, $source; # @_ への代入を explicit にしただけ
>>554 use warnings で出る。
s/\n/\n/って無駄じゃない? 一番遅いよ use strict; use Benchmark; $/=undef; open H,'foo'; my $S=<H>; close H; my $CNT=100; bench( sub{ my $C = $S =~ tr/\n//; $C++ if substr($S,length$S,1) ne "\n"; $C }); bench( sub {my $C = $S =~ s/\n/\n/g; $C++ if substr($S,length$S,1) ne "\n"; $C}); bench( sub { my($i,$C); while($i = index $S, "\n", $i+1) { $C++ } $C++ if (substr($S,length$S,1) ne "\n"); $C}); sub bench { my ($func, $C) = shift; my $t0 = new Benchmark; for(0..$CNT) { $C = $func->() } my $t1 = new Benchmark; my $td = timediff($t1, $t0); print "$C "; print "the code took:",timestr($td),"\n"; }
× $C++ if (substr($S,length$S,1) ne "\n"); $C}); ○ $C++ if substr($S,-1,1) ne "\n"; $C}); 間違えた
>>557 > use warnings で出る。
なるほど。じゃこれでどうだ。
my $len = &{sub {split /\n/, $source}};
× while($i = index $S, "\n", $i+1) { $C++ } ○ while(($i = index $S, "\n", $i+1) != -1) { $C++ } 動かしたら間違いだらけでした〜orz
use strict; use Benchmark; my $source = join("\n", 'a'..'zz'); print join(',', b_tr(), b_ss(), b_in(), b_gr(), b_ma(), b_su(), b_ev()), "\n"; #----------- Benchmark::cmpthese(-1, { b_tr=>\&b_tr, b_ss=>\&b_ss, b_in=>\&b_in, b_gr=>\&b_gr, b_ma=>\&b_ma, b_su=>\&b_su, b_ev=>\&b_ev, }); #----------- sub b_tr{ my $cnt = $source =~ tr/\n//; if(substr($source, -1) ne "\n"){ $cnt++; } return $cnt; } #----------- sub b_ss{ my $cnt = $source =~ s/\n/\n/g; if(substr($source, -1) ne "\n"){ $cnt++; } return $cnt; } #----------- sub b_in{ my($i,$cnt)=(0,0); while(($i=index($source, "\n", $i+1)) >= 0){ $cnt++; } if(substr($source, -1) ne "\n"){ $cnt++; } return $cnt; } #----------- 改行の制限がキツイ sub b_gr{ return scalar grep(/./, split("\n", $source)); } sub b_ma{ return scalar map { 1 } split("\n", $source); } sub b_su{ return scalar sub{ my @a=split("\n", $source); }->(); } sub b_ev{ return scalar eval{ my @a=split("\n", $source); }; }
use strict; use Benchmark; my $source = join("\n", 'a'..'zz'); print join(',', b_tr(), b_ss(), b_in(), b_gr(), b_ma(), b_su(), b_ev()), "\n"; #----------- Benchmark::cmpthese(-1, { b_tr=>\&b_tr, b_ss=>\&b_ss, b_in=>\&b_in, b_gr=>\&b_gr, b_ma=>\&b_ma, b_su=>\&b_su, b_ev=>\&b_ev, }); #----------- sub b_tr{ my $cnt = $source =~ tr/\n//; if(substr($source, -1) ne "\n"){ $cnt++; } return $cnt; } #----------- sub b_ss{ my $cnt = $source =~ s/\n/\n/g; if(substr($source, -1) ne "\n"){ $cnt++; } return $cnt; } #----------- sub b_in{ my($i,$cnt)=(0,0); while(($i=index($source, "\n", $i+1)) >= 0){ $cnt++; } if(substr($source, -1) ne "\n"){ $cnt++; } return $cnt; } #----------- 改行の制限がキツイ。全角スペース忘れてた。 sub b_gr{ return scalar grep(/./, split("\n", $source)); } sub b_ma{ return scalar map { 1 } split("\n", $source); } sub b_su{ return scalar sub{ my @a=split("\n", $source); }->(); } sub b_ev{ return scalar eval{ my @a=split("\n", $source); }; }
微妙に違うから注意ね。
http://codepad.org/igP5yvHl foreach my $source ("", "a", "a\nb", "\n\n", "a\nb\n"){
print "source:\n'$source'\n";
my $line;
$line = scalar (my @dummy = split /^/, $source);
print "split /^/: ", $line, "\n";
$line = scalar (my @dmmy = split /\n/, $source);
print "split /\\n/: ", $line, "\n";
$line = $source =~ tr/\n//;
print "tr/\\n//: ", $line, "\n";
$line = 0;
$line++ while($source =~ /\n/g);
print "while(/\\n/g): ", $line, "\n";
$line = 0;
$line++ while($source =~ /^/mg);
print "while(/^/mg): ", $line, "\n";
}
570 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/18(土) 21:10:58
奇異なことをやる自己満&美徳 きも
来た^^ けなせるだけの知識はあるかな?
>>570 寂しいからって適当なスレに独り言を投下する自己満&美徳
きも
ActivePerlに特化した質問は ここにしてもいいのですかね…? 5.10 と 5.12 を共存させたい・環境変数 Path を変更することで使い分けたいと思ってるんですが ActivePerl って異なるバージョンを共存できるんでしょうか? ppmを実行したとき、どちらか片方にモジュールをインストールしてしまう、 ということになったりしませんかね…? たしか、何かしらレジストリに書き込みをしていた記憶があるのです>ActivePerl そこを見て処理する何かが混ざってたら、 共存は難しいか、 もしくは、インストールする順番に注意しないといけないのでは、 という気がしているのですが…
リストの要素をランダムな順番に変えたいのですがどうやったらいいのでしょう。 @list = qw(0 1 2 3 4 5 6 7 8 9) 〜リストをランダムにする処理〜 print @list 結果例 2 5 4 0 9 8 6 7 1 3 のようにしたいです。
List::Util
気合でどうにかなるさ
#!/usr/bin/perl use Data::Dumper; my @list1 = qw(0 1 2 3 4 5 6 7 8 9); my @list2 = map(splice(@list1, rand @list1, 1), @list1); print Dumper(@list2);
この程度なら忍者様の手を煩わせる必要もないな。
>>578 横やりで申し訳ないけど、ランダム性を証明するにはどのようにしたらいい?
所詮は疑似乱数だ 本気でランダムにするには、熱雑音モジュールとかを用意しないと
583 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/19(日) 10:42:06
シャッフルもわからねえばかしね ほんとくず この俺よりかもクズは終わってる
「この俺よりかも〜」 っていうフレーズを良くみるけど、 よほど傷ついたんだな・・・。
>>581 たくさんループまわして
$list[0]〜$list[9]のそれぞれに
0〜9が各どのくらいの割合で入ったか平均取ってみたら
平均とっても、もし出力が偏って全部順繰りに出てる可能性を考えると、 平均を取る方法ではランダムかどうかはわからないんじゃないかと思うけど、 どうなんだろう?
>>585 平均とって綺麗に揃ったら、それはそれで一様乱数じゃないんだけどな
乱数にメルセンヌツイスタつかう
589 :
デフォルトの名無しさん :2010/12/19(日) 12:27:44
>>575 @list=0..9;print splice@list,rand 10-$_,1 for 0..9
ふぇぇ…
まずは「ランダム性の証明」の定義が必要だな
は?
ランダム (形動)(英random)任意にすること。手あたり次第にすること。また、そのさま。特に、確率論や統計学で、意志や感情を交えないこと。
594 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/19(日) 16:06:37
短く書いたコードをブログなどに乗せて自己満してるグズ クソなのに新しい書き方をわめいてるゴミ 一生文法のお勉強(笑)
短く書いた独り言を2chに書きこんで自己満してるクズ>>Perl忍者 クソなのに独り言をわめいてるゴミ 一生ぼっち(笑)
>>594 世の中、無意味な事の積み重ねで成り立ってるのは アタリマエ。
正しい事が正しいなんて思ってるとはピュアでいいとは思うけどさ^^
『Perl忍者』 くじけるなよ。ガンバレ。まじで。
忍者が増えてる...
ハッシュのスライスで、 ------------------------- my @k = qw(a b c); my @v = qw(A B C); my %h; ------------------------- @h{@k} = @v; を宣言の my %h; と一緒にできないでしょうか? イメージ的には↓のように。これはエラーになりますが。 my @h{@k} = @v;
>>574 > ppmを実行したとき、どちらか片方にモジュールをインストールしてしまう、
> ということになったりしませんかね…?
共存させるにはむしろそうする必要がある。
perl510.bat, perl512.bat がお奨め。
以下の形式のメソッド呼び出しを見掛けるのですが、解釈方法が分かりません。 => の左に来る文字列(-name)に、ダッシュ(-) が先頭に付いていてもクォートは不要なんでしょうか。 $obj->method(-name => "value");
602 :
601 :2010/12/19(日) 22:56:23
自己解決しました。
>>599 my %h = qw(a A b B c C);
これを作ればいいわけだから、
use List::MoreUtils qw(zip);
my @k = qw(a b c);
my @v = qw(A B C);
my %h = zip(@k, @v);
>>603 ありがとうございます。まさにコレ。
まぁ、でもやっぱり素ではできないんですね。
文法的に無理だろ
607 :
デフォルトの名無しさん :2010/12/20(月) 12:01:55
ハッシュをsetした順番を保った状態で JSON::XS (or JSON) で js 出したいのですが、どのようにしたらよいのでしょうか? JavaScript でもハッシュの取り出し順は保証されているものではないというのと、 配列使えばいいというのは、まあ確かにそう思うのですがハッシュでできないかなー と。
perlの普通のハッシュは格納順番に関する情報は一切保持してないから 死んでも無理。
610 :
607 :2010/12/20(月) 12:48:37
>>609 出来た!
しかも JSON::XS でもちゃんと出ました。
XS全く詳しくないけど、なんとなく tie のを渡したら壊れるのかと思ってたら全く問題なかった。
ありがとうございます。
自分はいつも my $test; $test->{1} = { 'name' => 'aaa', 'value' => 'tet4' }; $test->{2} = { 'name' => 'bbb', 'value' => 'etae4t' }; print $test->{2}->{'value'}; それか my $test; push(@{$test->{'sort'}}, 'test'); $test->{'test'} = 'ああ'; push(@{$test->{'sort'}}, 'abc'); $test->{'abc'} = 'かきくえ'; foreach my $hashname (@{$test->{'sort'}}){ print $test->{$hashname} . "\n"; } ってやってる
>>604 こんなのはどう?
my @k = qw(a b c);
my @v = qw(A B C);
my %h = map {($k[$_], $v[$_])} (0..$#k);
my %h; @h{@k} = @v; 一行にまとめられないのがちょっとくやしい...
614 :
Perl忍者 ◆M5ZWRnXOj6 :2010/12/21(火) 09:37:11
@WIKI アット ウィキの管理人はいじめの犯罪者だった(アットフリークス)
ソース
http://www.mudaijp.com/wp/1957.html 竹田隼也
いじめられていた被害者が2ちゃんねるのコテ環境様という人で、竹田隼也は2ちゃんねるの一部の板を運営してたみたいです(ボランティアだと思いますが)
逮捕された竹田隼也は、アットフリークスの取締役です。
現在の取り締まり役は、大野真和になってますね。
竹田隼也は、アットフリークを立ち上げたメンバーであることは確定しています。(まだ運営にも関わっています)
その当時の記事→アーカイブ
アット ウィキの運営情報(whoisより)
有限会社アットフリークス
640-8227
和歌山県和歌山市西汀丁26番地県経済センター6F
当時はアットフリークスが運営するBBSにもこのいじめのことが書かれてたみたいですが、現在はすっかり削除されています(隠蔽)。
公の場で問題になってから事実を公表する運営も信用できませんよね。
絶対に知ってるはずなのに、このようなコメントを残しています。
use utf8; my $test = 'あいうえお'; print "$testかきくけこ"; とすると 「$testかきくけこ」 という変数名になるようで、今は print "$tset\かきくけこ"; の様に対応しています。 一応は動いてますが、これで合っているのでしょうか? それとも print $test . "かきくけこ"; の様に "" の外に出してドットやカンマで繋げるべきなんでしょうか?
>>615 {} で区切るのが普通かと
"${test}かきくけこ" とか "${test}abc" とか
個人的には不便としか感じないから止めたいけど方法を知らない...
>>615 自分も、"${test}かきくけこ" とかは本とかで見たりはするけど使わない。
sprintf も、%sが多くなるとなにがどれだか面倒くさくなるので、 "$test\かきくけこ" をよく使う、
けど、こういう場合たいてい半角スペースを前後に空けた方が見やすくなる場合が多いので実際にはよく使わない。
\ で区切るのがなんかスカっとしないんで、${} でいこうと思う。 ありがとうです m(_ _)m
620 :
Perl忍者(竹田隼也) ◆M5ZWRnXOj6 :2010/12/22(水) 21:11:04
^^;
621 :
デフォルトの名無しさん :2010/12/24(金) 21:35:22
サブルーチンで文字列を全角英文字部分を半角に変換する単純なプログラムなんですが、 このサブルーチン部分を外部ファイルにして、requireで呼び出すと、全角半角変換の部分 が効かなくなってしまいます。なぜなんでしょうか? use utf8; use Encode; use DB_File; my $name = &get_name(4563); print $name,"\n"; sub get_name { my $key = $_[0]; my $name = (split(/\t/, $index{$key}))[3]; $name = decode('utf-8', $name); $name =~ tr/A-Za-z0-9!”#$%&’()/.\x{3000}/A-Za-z0-9!\"\#$%&'\(\)\/\.\x{0020}/; $name = substr($name, 0, 11); $name = encode('utf-8', $name); return $name; }
書かれていない部分に問題があるな。
%index
625 :
デフォルトの名無しさん :2010/12/25(土) 09:45:47
なんか、本番用プログラムに組み込むと効かなくなるみたい。 my $enc = guess_encoding($company_name); print "1******$company_name($enc)<br>"; $company_name = decode('utf-8', $company_name); $company_name =~ tr/A-Za-z0-9!”#$%&’()/.\x{3000}/A-Za-z0-9!\"\#$%&'\(\)\/\.\x{0020}/; $company_name = encode('utf-8', $company_name); my $enc = guess_encoding($company_name); print "2******$company_name($enc)<br>"; 1******日経300株価指数連動(Encode::utf8=HASH(0x156141c0)) 2******日経300株価指数連動(Encode::utf8=HASH(0x156141c0))
company nameの設定とか必要なuseを補って実行する限り何の問題も なかったので書かれていない部分がだめなんだろうな。ちゃんと再現する 例を示せないならエスパーさん以外には回答は無理な気がする。
627 :
デフォルトの名無しさん :2010/12/25(土) 11:14:34
単純化して再現環境を作ってみた。 #!/usr/local/bin/perl use Encode; use utf8; my $text = "ABCD"; print &change($text),"\n"; sub change { my $text = $_[0]; # $text = decode('utf-8', $text); $text =~ tr/A-Za-z0-9!”#$%&’()/.\x{3000}/A-Za-z0-9!\"\#$%&'\(\)\/\.\x{0020}/; $text = encode('utf-8', $text); return $text; } $ ./test.pl ABCD
628 :
デフォルトの名無しさん :2010/12/25(土) 11:16:42
#!/usr/local/bin/perl require './test2.pl'; use Encode; use utf8; my $text = "ABCD"; print &change($text),"\n"; -------------------------------- $ cat test2.pl sub change { my $text = $_[0]; $text =~ tr/A-Za-z0-9!”#$%&’()/.\x{3000}/A-Za-z0-9!\"\#$%&'\(\)\/\.\x{0020}/; $text = encode('utf-8', $text); return $text; } 1; -------------------------------- ./test.pl ABCD なぜ?
Undefined subroutine &main::encode called at test2.pl line 4.
ああ、Encodeはtest1.plに含まれるのか。 test2.plにuse utf8;を追加だな。
>>628 test2.plの方にもuse utf8必要。
632 :
デフォルトの名無しさん :2010/12/25(土) 12:42:03
サブルーチンの内側にuse utf8;を宣言したら、動きました。 こういう書き方は初めてなんですが、どうしてサブルーチンを別ファイル化すると、メインプログラムのuseの宣言が効かなくなるのでしょうか? 効いていないのはuse utf8だけのように思えますが
634 :
デフォルトの名無しさん :2010/12/25(土) 13:48:25
マルチスレッドでカウンタ変数を共有するのにこういう書き方してもいいんでしょうか? インクリメントは値を返した後に行われるのでしょうか? my $num = do{ lock($cnum); $cnum++ }
doのブロックも一応ブロック扱いっぽいけど、どうなんだろ。 独立したブロックで書いた方が安全だろうけど。 結果は、インクリメント前の値が返る。
質問です。 ユーザ定義の関数で左辺値コンテクストを使うことはできないでしょうか? substr( $var, 2, 3 ) = 'ABC'; の様なことをユーザ定義関数でやりたいのです。
>>637 ありがとうございます!
読んでみます。
639 :
デフォルトの名無しさん :2011/01/05(水) 22:47:32
Wikipediaの元データから企業データベースを作っているのですが、 $text="株式会社ナナオは、ディスプレイ (コンピュータ)|ディスプレイ装置専業メーカー。" これを "株式会社ナナオは、ディスプレイ装置専業メーカー。" にする置換スクリプトはどう書くのでしょうか? このタグの書き方はちょっと特殊で困っています。
縦棒の意味が分からん
641 :
デフォルトの名無しさん :2011/01/05(水) 23:05:01
|はWikiipediaが使っているCMSソフトのMediawikiのタグで Nanao coporation is a manufacturer of high-end displays (computer)|display. のようなソースを Nanao coporation is a manufacturer of high-end <a href="display (computer)">display</a> のように展開するのだと思います。 普通のWIkiなら、 Nanao coporation is a manufacturer of high-end [display]. と書くところですが、これだとdisplayの検索結果が複数生じるため、computer->displayみたいな オブジェクト指向の書き方ができるようにタグが拡張したのではないかと思うわけです。
なんで[[]]を抜かすの
それで混乱せずに解釈できるんだな
マークアップ解析だけでなく、自然言語処理が絡む話に見える
printについて質問があります。 これだとfooにprintされるが perl -e 'open (my $fh , ">" . "foo") or die "open error $!\n" ;while(1){print $fh "bar\n"}' これだとfooにprint されないのはなんでなのでしょうか? perl -e 'open (my $fh , ">" . "foo") or die "open error $!\n" ;while(1){print $fh "bar\n";sleep 1}'
646 :
645 :2011/01/06(木) 02:52:59
すみません、シグナルハンドリングしたら解決しました。 首釣ってきます。
どーでもいいけど、openは3引数にすれば
648 :
645 :2011/01/06(木) 03:16:43
ですね。ご指摘どうもありがとうございます。
%test = ( 'aaa' => '000', 'bbb' => '111' ); %test = ( 'ccc' => '222', 'ddd' => '333' ); こんな風にした場合、%test の {'aaa'} と {'bbb'} が上書きされるのですが、それを回避する時 $test{'ccc'} = '222'; $test{'ddd'} = '333'; とせずに一括で変数に格納できないものでしょうか?
%test = ( %test, 'ccc' => '222', 'ddd' => '333' );
あ〜、なるほど。
@test{ 'ccc', 'ddd' } = ( '222', '333' );
653 :
デフォルトの名無しさん :2011/01/06(木) 13:41:22
>>644 これはやっぱり、$line =~ 系の書き方だと処理できないでよね。
そもそも英語だとワードの分割単位が判るので、ワードごとに戻る置換処理はできますが、日本語だと、ワードの区切りが判らない
でもMediawikiが、日本語の形態素解析をやってるとは思えないし、普通の多言語対応処理のなかでどうやって[]のタグなしで
タグの範囲となる日本語の区切りを判別させてるか謎です。
メカブ使えば早いんじゃね?
>>654 お前なにいってんの?
それは食べ物だろ?
元データってどこから取ってるの? 編集画面だと '''株式会社ナナオ'''({{Lang-en-short|''EIZO NANAO Corporation''}} )は、[[ディスプレイ (コンピュータ)|ディスプレイ]]装置専業メーカー。 ってなってるけど
バカ発言してお前ら安心したか? メカブくらいしってますよ(ゴホン
( ´∀`)σ)∀`)
顔文字オタクですか?
660 :
デフォルトの名無しさん :2011/01/07(金) 20:30:26
>>656 XML形式のWikipediaのダンプデータ
http://download.wikimedia.org/jawiki/20101102/ にあるpages-articles.xml.bz2というファイル。
ところで、
ウィキページのデータはSQL(DB言語)のテーブルではなく、XML(マークアップ言語)で提供されます。
という文字列から()部分だけを削除するにはどうしたらいいのでしょうか?
$text =~ s/\(.*\)//g;
とやると最初の(から最後の)まで全部削除されてしまいます。
.*? で非欲張りにしとく
662 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/07(金) 20:45:14
正規表現できねえごみくずか?
663 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/07(金) 21:10:33
660みたいな低脳見ると安心する
禿同
665 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/07(金) 21:20:48
久しぶりに嬉しいレスがきましたwwwwwwwwwwwwwwwwwwwwwwwwwww
666 :
デフォルトの名無しさん :2011/01/07(金) 22:00:45
できました! みなさんのおかげです
どういたしまして
668 :
仕様書無しさん :2011/01/08(土) 18:59:17
あの、暇人やチャット好きのPerl使いっていますか? その人たちはどこいますか?perl-casual以外で教えてください
はい、お気楽チャットです
if ($bool) { $array->[$i] = $elem; $str = "ほげ"; $new_array = $array; } else { $str = "ふが"; $new_array = $array; } 上のコードを3項演算子で書こうと思ったのですが、値を返す前に1つ処理をさせる事は可能でしょうか? my ($str, $new_array) = ($bool)? {$array->[$i]=$elem; ("ほげ", $array)}: ("ふが", $array); #=> syntax error at _, near "; (" my ($str, $new_array) = ($bool)? ("ほげ", $array, $array->[$i]=$elem;): ("ふが", $array); # 今回はこれでたまたまうまく出来たのですが
>>671 つ do
読みにくくなりがちだからほどほどにな。
>>671 my ($str, $new_array) = ($bool)? $array->[$i]=$elem && ("ほげ", $array): ("ふが", $array);
>>673 $elem=0;
my ($str, $new_array) = ($bool)? $array->[$i]=$elem && ("ほげ", $array): ("ふが", $array);
>>674 $elem=0;
my ($str, $new_array) = ($bool)? $array->[$i]=$elem || 1 and ("ほげ", $array): ("ふが", $array);
676 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/11(火) 19:22:55
join "特別入社",grep /Perl忍者/,@sinsotu;
677 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/11(火) 19:27:14
・・・?
678 :
デフォルトの名無しさん :2011/01/11(火) 19:28:39
どこに入社するんですか? $black_kigyouですか?
679 :
デフォルトの名無しさん :2011/01/11(火) 21:14:25
>>677 462 : ◆cZfSunOs.U :2011/01/11(火) 06:15:21 発信元:206.223.151.75 0
こちらの bbs.cgi 書き換えミスだったようです,すみませんでした......
468 :名無しさん@お腹いっぱい。:2011/01/11(火) 06:21:53 発信元:211.13.107.120 0
>>462 面白かったから構
483 :名無しさん@お腹いっぱい。:2011/01/11(火) 06:49:25 発信元:202.140.195.191 0
>>462 くそわろたwwwww
485 :名無しさん@お腹いっぱい。:2011/01/11(火) 06:56:05 発信元:126.110.93.157 0
笑うとこじゃねえよ
死ね能無し
486 :名無しさん@お腹いっぱい。:2011/01/11(火) 07:00:50 発信元:210.135.100.132 (762198) P
νカスから出てくるんじゃねーよカス共
488 :名無しさん@お腹いっぱい。:2011/01/11(火) 07:17:49 発信元:210.135.100.132 (706341) P
>>485 ちょっと書けなくなっただけのミスを笑って許せない貴方は2ちゃんねるに向いてないよ
嫌なことでもあったのかな?だからピリピリしてるの
490 :名無しさん@お腹いっぱい。:2011/01/11(火) 07:29:13 発信元:126.110.93.157 0
向き不向きの話をするならたかが死ねってレスを軽やかにスル―出来ないほうがよっぽど向いてないと思うんだがw
492 :名無しさん@お腹いっぱい。:2011/01/11(火) 07:36:48 発信元:114.175.48.194 0
周りのスルー前提で書き込むとか甘ちゃんですねーw
680 :
デフォルトの名無しさん :2011/01/12(水) 03:33:43
おいIDの算出法わかったか?
0chと同じじゃねーの?
>>672 doを使うと複数行実行&最後に評価された値を返してくれるのですね。
レスありがとうございました。
>>673-675 これは・・・ありがとうございます。
andはこういう場合に使える(?)んですね。
どのみち$new_arrayの中身は$arrayになるので
my $str = ($bool)? do {$array->[$i]=$elem; "ほげ"}: "ふが";
こうしました。
・perl ・gtk2 ・windows7 という組み合わせでプログラミングできる環境を作ろうとしていますがうまくいきません 参考になるウェブページがあったら教えてください
そうそう tk使うといろいろ楽しそうなのに、どうもハードルが高い unixとwindowsはどこまで水と油なんだ
WinでGUIやりたいなら.NET使えば
.NETの最大の欠点は ぐぐれない
688 :
デフォルトの名無しさん :2011/01/15(土) 13:32:12
いくつかモジュール使っていて、この関数がどのモジュールからやって来たものなのかを 調べるにはどのようにしたらよいのでしょうか?
use してるモジュールを一つづつコメントアウトしていく。 perldocでモジュールを調べる。 モジュールのソースを読む。
use Class::Inspector;
whileでずっと動かしてるサブルーチンがあるとして、これが「時速600回」みたいにどれぐらいのペースで動いてるかってのを出したいんですけど何か簡単な方法ないですか?
Benchmarkモジュールのこと?
質問お願いします。 クイズ出題ツールを作っています。 年度ごとにフォルダを作り、それぞれに個人の得点を記録する下のようなP_List.txtを置いています。 %PLAYER_LIST=( "Taro"=>"問1,問2,…", "Hanako"=>"問1,問2,…", ); 「各年度の全ての問の得点が0のとき」"全部0です"と表示させるために、下のように組んだのですが、もっと効率の良い方法はないでしょうか? @kakdt=('2007','2008','2009'); foreach my $nen (@kakdt){ require "./$nen/P_List.txt"; @PL_p=split(/\,/,$PLAYER_LIST{"$name"}); foreach my $point (@PL_p){ $check=1 if $point; } } print "全部0です"if !$check;
>>691 Time::HiRes::time()
>>693 if ($point) { $check = 1; last; }
package Package; use strict; use Image::Magick; sub new { my ($pkg, $param) = @_; my $hash = { img => $param->{'img'}, plot => (defined $param->{'plot'} and $param->{'plot'} > 0) ? $param->{'plot'} : 3, }; return bless $hash, $pkg; } ここに来る $param->{'img'} っていうやつはなんだとおもう? 教えてよ!
newで$paramに渡すとき $param->{'img'} としている newにわたす$paramはなに? なんのオブジェクト? 何を渡すんだ・・・教えてください
明日の朝ここみて回答内容がゴミだったり 回答自体なかったら まじここのスレぶっつぶすからな
698 :
693 :2011/01/16(日) 01:08:59
>>694 あ、確かにlast使った方が効率よくなりますね!
ありがとうございます!
2重ループだたか
LABEL: foreach my $nen (@kakdt){
で、
if ($point) { $check = 1; last LABEL; }
かな
>>698
700 :
693 :2011/01/16(日) 01:29:23
立て続けにすみません。 先ほどのを導入して試したら別の問題に突き当たりました。 不正解時の処理で、$PL_p[$q_no]--として点数を引き、&DBM_SAVE;で別途用意したサブルーチン(下記)で減点後の点数を保存してから先ほどのものを書いています。 sub DBM_SAVE{ open(PUSHLOG,">./$DBF/$nend/$DB_P"); print PUSHLOG "\%PLAYER_LIST=(\n"; foreach $key (sort {$a<=>$b} keys %PLAYER_LIST){ if($key ne $ENV{'REMOTE_USER'}){ print PUSHLOG "\"$key\"=>\"$PLAYER_LIST{$key}\",\n"; } } print PUSHLOG "\"$ENV{'$name'}\"=>\"@PL_p\",\n"; print PUSHLOG ");\n"; close(PUSHLOG); } ところが、得点状況自体は保存されているものの、@VL_pに入るのは減点前の点数になってしまいます。 どこがいけないのでしょうか? $PL_p[$q_no]--; &DBM_SAVE; CHECK: foreach my $nen (@kakdt){ require "./$DBF/$nen/$DB_P"; @VL_p=split(/\,/,$PLAYER_LIST{"$ENV{'$name'}"}); foreach my $point (@VL_p){ if ($point){$check=1; last CHECK;} } }
701 :
693 :2011/01/16(日) 01:33:10
すみません $ENV{'$name'}は訂正ミスで$nameです。 × print PUSHLOG "\"$ENV{'$name'}\"=>\"@PL_p\",\n"; ○ print PUSHLOG "\"$name\"=>\"@PL_p\",\n"; × @VL_p=split(/\,/,$PLAYER_LIST{"$ENV{'$name'}"}); ○ @VL_p=split(/\,/,$PLAYER_LIST{"$name"});
こういうアホがcgi作るからデスマになるのか。 なるほど、勉強になったよ。
local$,="," すごいすくりぷとだなー()
あーちがったけどまーいーや
・・・
http://d.hatena.ne.jp/ryoff/20090802/1249229766 sub new {
my ($pkg, $param) = @_;
my $hash = {
img => $param->{'img'},
plot => (defined $param->{'plot'} and $param->{'plot'} > 0) ? $param->{'plot'} : 3,
};
return bless $hash, $pkg;
}
ここの
newの第2引数$paramに何を渡せばいいんですか?教えてください
my ($pkg, $param) = @_;
$param->{'img'},となっているのでハッシュリファレンスだとおもうんですが
Package->new()に渡す引数は何で生産したものですか?教えてくだう
>>706 ファイル名とかその他いろいろ。
つーか、こんなもん自分で実装しろよ。根本的に勘違いしている。
^−^;
709 :
デフォルトの名無しさん :2011/01/16(日) 10:52:49
「モダンPerl入門」のP154に、 --------- ただし、親プロセスがただfork()してexit()しただけでは子プロセスも終了させられてしまいますので・・・ --------- ってあるんですが、試したところ親プロセスが fork -> exitしても子プロセスは落ちず、pstree で見ても init の直下にちゃんと(?)なってるんですが、上記の文章の意味はどういうところにあるのでしょうか? どなたか詳しい方お願いします・・・ CentOS5.5 64bit perl v5.8.8
710 :
デフォルトの名無しさん :2011/01/16(日) 11:03:34
>>709 「素人がでたらめな入門書を書きました」という意味です。
711 :
デフォルトの名無しさん :2011/01/16(日) 11:06:49
この本の著者を素人呼ばわりできるってことは お前相当すごいやつなんだな
713 :
デフォルトの名無しさん :2011/01/16(日) 12:27:22
JPA会長を悪く言うな死ね
714 :
デフォルトの名無しさん :2011/01/16(日) 12:30:39
ボクハ JPA ニセンノウサセラレテイタ
715 :
709 :2011/01/16(日) 12:37:35
できれば
>>709 の内容について教えて頂けると助かるんですが・・・
716 :
デフォルトの名無しさん :2011/01/16(日) 12:39:17
718 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/16(日) 12:50:14
my $obj=Package->new({'img'=>'banana.jpg','plot'=>5}); やっぱりハッシュリファレンス渡すだけであってたようでえすね^^; 久しぶりにPerlやったので頭が回りませんでした^^;
>>715 >>710 で説明したとおりでたらめな記述です。その本は速攻でごみ箱に捨てることをお勧めします。
いいかげんにしろよ、まつもとひろゆき
721 :
709 :2011/01/16(日) 13:03:24
>>719 「でたらめ」 である事の証明を書いて頂けないと判断が付かないんですが。
少なくとも私は今コレを読んで勉強しているので。
モダンPerl入門は分からないけど、親が死ぬとinitの子プロセスになるのは、 詳解UNIXプログラミングのP189に書いてあるよ。
>>721 これででたらめと判断できるかい? クソ本はすぐにゴミ箱に捨てましょう。
http://en.wikipedia.org/wiki/Orphan_process An orphan process is a computer process whose parent process has
finished or terminated, though itself remains running.
In a Unix-like operating system any orphaned process will be immediately
adopted by the special init system process. This operation is called
re-parenting and occurs automatically.
Even though technically the process has the "init" process as its parent,
it is still called an orphan process since the proces
724 :
700 :2011/01/16(日) 14:09:21
725 :
709 :2011/01/16(日) 14:14:44
>>722 ,723
ありがとうございます。ちょっと高くて買えません。立ち読みに行こうかな・・。
「プログラミングPerl vol2」 の P1074 にも setsid の説明のところで 「モダンPerl入門」 と同じような説明がありますが、私なりに↓のようなことなのかな、と思いました。
たぶん、
-------
同じプロセスグループに属している最中に、親を ctrl+c などで
落としたら子も落ちるので、その影響を受けないように POSIX::setsid
して別のプロセスグループに移した方が良いよ。
-------
って意図ですよね。おそらく。
これなら確かに実際に動かして親が落ちて子も落ちることが確認できました。
726 :
デフォルトの名無しさん :2011/01/16(日) 14:44:24
>>725 > 同じプロセスグループに属している最中に、親を ctrl+c などで
> 落としたら子も落ちるので、
違うよ。
> ただし、親プロセスがただfork()してexit()しただけでは子プロセスも終了させられてしまいますので・・・
これは忘れろ。「モダンPerl入門」とやらはでたらめ書いてるクソ本。
親プロセスが死んでも子プロセスは死なない。
727 :
709 :2011/01/16(日) 15:03:58
>>726 >> 同じプロセスグループに属している最中に、親を ctrl+c などで
>> 落としたら子も落ちるので、
>違うよ。
んーー。こちらの環境では、ちゃんと親も子も $SIG{INT} が動くんだけど・・・。
洗脳解除してる気分になってきた。w
>>727 制御端末からのsignalはそのセッションに属するプロセス全部に送られる。
親プロセスが死んだから子プロセスが死ぬのではなく、(子プロセスに)SIGINTが
送られたから終了する。
理解できたらクソ本は捨てましょう。
729 :
709 :2011/01/16(日) 15:44:45
>>728 そうなんですね。ありがとうございます。
なにか良書はないでしょうか? 日本語ので。
薦められたり罵られたり大変だなw <もだんPerl
誰か薦めてるのか?
クソらしいのでJPA退会しました
僕もJPAギルド脱退しました
私はJPAクランを抜けました
私は綺羅星十字団に入りました。
####### ギルド名 #########
★JPA(Japan Perl Association) ★
ギルドマスター(代表者) 牧大輔@最強パラディン(レベル75)
資本金 1000万アデナ
##### 主な活動 ######
Ruby,PHP,Pythonプレイヤーへの嫌がらせ
JPA勧誘
#######入隊条件#########
毎年5000円を納められる方
Perlレベル50以上の方
やる気のある方
ギルドHPはここです
http://japan.perlassociation.org/ です
737 :
デフォルトの名無しさん :2011/01/16(日) 19:40:45
Perlレベル2ですけど やる気あります だめですか?
はじめまして、私がJPAギルド代表です
>>737 はい、レベル2ですと瞬殺されてしまうので
レベル50以上になってからお越しください
>>736 これ以上新たな刺客を送り込むのは本当にやめてくださいお願いします
740 :
709 :2011/01/16(日) 20:07:03
>>729 で良書は無いですか?って聞いただけなんですけど・・。
あんま無いんですね。
はい
しつけえぞおまえこら どつくぞ
743 :
デフォルトの名無しさん :2011/01/16(日) 20:31:47
perlのonelinerとデバッガの使い方を詳しく書いた本って無い? 特にonelinerのオプション一覧と便利な実例が豊富なの。
744 :
700 :2011/01/16(日) 21:16:09
745 :
709 :2011/01/16(日) 21:22:22
>>744 コードは5行くらいまで短くしてくれないと読む気にならないかな。
>>693 に大まかな構造を書いています。
下記のように$PL_p[$q_no]を減点し、サブルーチンを呼び出してP_List.txtを更新してから
各年度の全ての問の得点が0になっているかどうか、をチェックしているのですが、
処理後のP_List.txtを見ると、ちゃんと減点が反映されているのですが、
ループでのチェック時にはそれが反映される前のデータを参照してしまいます。
上から順に処理されているはずはのに、どうしてそうなってしまうのか分かりません。
$PL_p[$q_no]--;
&DBM_SAVE;
CHECK: foreach my $nen (@kakdt){
require "./$DBF/$nen/$DB_P";
@VL_p=split(/\,/,$PLAYER_LIST{"$ENV{'$name'}"});
foreach my $point (@VL_p){
if ($point){$check=1; last CHECK;}
}
}
747 :
709 :2011/01/16(日) 23:23:54
反映した後のデータは require で読みこんで更新していると?
require "./$DBF/$nen/$DB_P"; で読み込みし直しているので@VL_pには更新後のデータが入ると思うのですが…。
749 :
709 :2011/01/17(月) 01:03:54
"./$DBF/$nen/$DB_P" のファイルに、print "---load---\n"; って追記して、 さらにメインのスクリプトに下のように何個か書いてから、 require "./$DBF/$nen/$DB_P"; require "./$DBF/$nen/$DB_P"; require "./$DBF/$nen/$DB_P"; 動かすとどうなる? %INC
750 :
デフォルトの名無しさん :2011/01/17(月) 01:05:19
減点処理どこでしてんだボケ
れーきーしーかーるー
このクイズ出題ツールはな このスレにも出題する様に作られとんねん
753 :
デフォルトの名無しさん :2011/01/17(月) 15:24:12
質問です。 外部テキストファイルを読み込んで、1行目から10行目を飛ばし、 11行目から処理を行うというプログラムを書きたいのですが 1行目から10行目を飛ばすにはどのようなコードを書けば良いでしょうか?
行数数えながら読むだけ読んで無視すればよい。
10回空読みすりゃいい
756 :
デフォルトの名無しさん :2011/01/18(火) 02:03:58
>>754-755 レスありがとうございます。
どのようなコードを書けば良いのでしょうか?
eval "<FH>;"x10
eval は余り使いたくないので my $line; for(1..10){ $line = <FH> } $line = <FH>; # 11行目 このまま素直に書くと10行以下はエラーになるんで、 eof() 使ってくだちぃ
759 :
デフォルトの名無しさん :2011/01/18(火) 02:53:29
>>757-758 ありがとうございます。
書いて走らせてみたのですが上手くいきません。
>>758 さんのコードを使って、ファイルを読み込んでいるのですが
何も出力されないです。
ファイルは11行以上ありますか ファイルをopenしてますか 読み込んだ内容をprintしていますか お好きなのをどうぞどうぞ
出力先は正しいですか 間違ったリダイレクトをされていませんか バッファはフラッシュされていますか
762 :
デフォルトの名無しさん :2011/01/18(火) 03:08:12
普通に+9すりゃいいじゃん
以下のようにして、確認すればいいよ。 -------------------------------- #!/usr/bin/perl -w use strict; open(my $fh, '/var/log/messages'); my $i=1; while(<$fh>){ print "$i: $_"; $i++; }
764 :
746 :2011/01/18(火) 10:40:01
>>747 ---load---が最初に読み込んだ1回分しか表示されず、ループ処理での読み込みが飛ばされていました。
どうも、同じファイルは1度しか読み込めないようです。
これはサーバーの仕様なのでしょうか?perlがそういうものなのでしょうか?
>>750 分かりづらくてすみません。
$PL_p[$q_no]が得点になっていて、$PL_p[$q_no]--;で減点処理をしています。
>>764 require "./$DBF/$nen/$DB_P"; → do "./$DBF/$nen/$DB_P";
これでやってみそ
766 :
746 :2011/01/19(水) 01:24:47
>>765 おお、出来ました!
doとrequireの違いで調べたら、doは複数回呼び出すと呼び出された分だけ実行して
require、useは複数回呼び出しても一度しか実行されないとのことでした。
勉強になりました。
回答してくださったみなさん、ありがとうございました。
Perlを始めて間もない学生です。
http://nlp.nagaokaut.ac.jp/Apple_Pie_Parser 上記リンクのApple Pie Parserを用いたプログラムを作っています。厳密に言うとCGIですが、Perlのコーディングに関する問題だと思うのでこちらで質問します。
フォームに入力した英文を上記のツールにかけて出力結果を出そうとしています。
Windowsで開発しているので、英文入力→cygwin起動→そこであらかじめ指定したコマンドを入力するようコーディング→結果を受け取る
という感じにしたいのですが、cygwinを起動させることができません。
どうすればいいでしょうか。
窓を窓から投げ捨てる
>>767 cygwin使ったことないけど、実行ファイルはcygwin上じゃなくても動かせるんじゃないの?
cygwin上 の Perl はいろいろ動かないケースが出て使うのやめてしまったなあ 今なら Strawberry Perl とかどうなんだろうね?
>>769 実行ファイルと同ディレクトリにcygwin1.dllを設置すればcygwinなしでも起動できるのですが、
そうすると今度はディクショナリファイルが開けない、とのエラーが出てきます。
そのファイルもインストールフォルダからコピーし、同ディレクトリに設置しましたがこちらはエラーが解決しません。
何らかの設定ファイルのパスをいじるべきでしょうか?
knoppixでもDLすれば万事解決 perl入門にはcygwinじゃなくlinuxを使うべき
cygwin使うくらいなら素直にlinux起動する
WindowsだったらActivePerlでいんじゃね?
ActivePerlでいいだろ。
実行部分はactiveperlがいいけど、 フロントエンド部分でcygwin必須なことがよくある
仮想マシンぶっこもうぜ
778 :
デフォルトの名無しさん :2011/01/21(金) 00:57:09
X68000エミュにPerl5ぶち込んで使うのが何故か至福。 X68k版Perl5を持ってるのは、恐らく今や世界中で俺だけ。 実機もいまだに健全稼動してる俺勝ち組?
マルチスレッドに関して for文で1000個(同じ内容)のスレッドを発行したいが 同時に並列させるのは4つまでにしたい。 4並列はセマフォで管理するとして ひとつのスレッドが終わったらjoinで回収して すぐに次のスレッドを発行したいのだがいい方法ありますか?
perl で?
781 :
779 :2011/01/21(金) 17:59:15
自己解決。 forじゃなくてqueueとsemaphoreの合わせ業でいけた。 is_joinable()でスレッド監視して、Join待ちのロックが起きないようにできました。 リニア実行に比べて4並列で約3倍早くなった!
782 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/21(金) 19:21:45
ネットワークだったら LWP 画像だったら PerlMagick っで 音楽、画像、ネット、動画で他に楽しめそうなモジュールやつあったらおしえて
783 :
Perl忍者 ◆M5ZWRnXOj6 :2011/01/21(金) 19:23:29
早く教えろ
うっせーよ糞コテ
LWP::Simple の get で undef がたまに返ってくるんだが 再現性が無い・・・ 同じ問題に遭遇した人いる?
getに失敗した時の処理は難しいな
だいたいundefで失敗したんだなってわかんだろばかが
その時に、即座に再取得していいもんかどうかが難しい
791 :
デフォルトの名無しさん :2011/01/22(土) 10:56:01
SIerが三菱じゃない事を確認しておかないと、岡崎の事件みたいに逮捕される。
どれだけ時間置くとか、何回までリトライするとか、断念した時の処理とか、 それだけの手間を全てのgetにかけるのかとか、うんざりしてくる
じゃあLWP::UserAgent使ってろよかす
かすっていうやつがかす
ルーターの NAT テーブルがいっぱいいっぱいで、接続が中断されたとき、LWP は is_success で確認すると成功を返す。 is_error も同じで、ルーターがいっぱいいっぱいで接続中断されてもエラー無しと返す。 なので、HTML に限っては ->content に </html> があるかどうかで判断してる。 画像は HEAD で得たファイルサイズと一致してるかどうか。
なるほど〜。でもルーターがいっぱいいっぱいだとheadも得られないんじゃ?
797 :
786 :2011/01/22(土) 17:22:22
undefを受け取って最初に疑ったのは連続アクセスによるサーバーエラーなんだが パケットキャプチャしてみるとそもそもHTTP GETリクエストを送出していない・・・ なのでLWP::UserAgentを調べてる ← いまここ ちなみにundef受け取ったら1秒待機して再getをすると上手くいく
あるルータがそういう挙動をするという事を一般的な現象と思い込んでしまう、 底辺perl脳。 そもそもNATテーブルに空きがなければ、普通コネクションは成立しないよね。 どんな、ルータ使ってるんだか知らないけど。w
>>796 head で得られるデータってすごく短いから、それぐらいなら正常に終わるけど、
ちょっと長いのになるとルーターが取りこぼす。
ちなみに BA8000Pro
他のルーターでもテーブルがいっぱいいっぱいだときっつい
許容量を超えると DNS 解決すら出来なくなる
IP さえ分かればなんとかデータは取ってこれるけど、ものすごい不安定。
NATの仕組みを理解していれば、そんな結論には至らないわけだが。 恐怖のperl脳 NATテーブルがあふれたから不安定になるんじゃなくて、不安定だから 再接続を繰り返してNATがあふれたんだろ。 NATテーブルを線形探索しているヘッポコルータなら、テーブルが埋まっ てくると不安定になるというのはありうるが、そんなルータ生き残って ないだろ。
いやテーブルが溢れなければ LWP で挙動が変になることはない ルーターの NAT テーブル保持数が 2000 を越えたあたりから DNS の変換が出来なくなったり、接続出来ても処理が不安定に なってるから切断されたり。
はいはいわろすわろす
なっ、perl脳って怖いだろ。これで本人はいたって本気なんだから。
某中規模向けルータでも、デフォだとNATテーブル埋まりやすくて不安定になるが・・・ テーブル溢れさせたことないから、 そのときのLWPの挙動なんて知らんけど。
まぁ普通に使ってりゃテーブルが埋まること無いし、 体験した事じゃなきゃ信じない人種にとっては信じられない事かな?
>>805 規模によっては普通に使ってて、4096テーブル埋まるんですけど。
まぁ個人ユーザなら、普通は体験する事ないよね。
ないなう
油断してると前科者になるぞ
「サイバーテロの練習をしているかもしれない」
>>806 使ってる BA8000Pro はテーブル数が 2600 なんで、ちょっと Linux ISO がバージョンアップしたときなんて結構辛い
なので数日待ってから放流してる
まぁ Perl とは無関係の話しだし程ほどにw
以下のようなボタンが二つあったとして 最初のボタンを押したいんですがどうやったらできるのでしょうか? use WWW::Mechanize でどうにかできるようにしたいです。 <form action="xxxx" method="post"> <input type="submit" name="yyyyyyy" value="yes"> <input type="submit" name="nnnnnnn" value="no"> </form>
>>811 WWW::Mechanizeのドキュメントをあと10回くらい読み返す
>>815 それバージョン古いので新しいの用意して下さい
813(≠814-817)です。 $mech->click_button( name => 'yyyyyyy'); とするとエラーが出ました。 No clickable input with name yyyyyyy at /usr/lib/perl5/site_perl/5.10/WWW/Mechanize.pm line 1765 ヒントをおねがいします。
yyyyyyy がtypo
open my $fh,"<","file.txt"; $fhは型グロブのリファレンスのようなんですが そのリファレント(型グロブはどうなってるんでしょうか?何が入ってるんでしょうか? 教えてください 内部的なものまで意識する必要はないでしょうか?教えてください
print $fh
^0^
正規表現で文字列の検索開始位置を指定するにはどうすればいいでしょうか? $string = "aaaaa"; while ( $string =~ /a/ ) { print "aを見つけました\r\n"; } たとえば上のスクリプトを動かすと無限ループに陥りますが, aを見つけたら次はその位置の次の文字から検索するようにすれば aの文字数分だけでループを終了できるはずです。 このような検索開始位置の指定は可能でしょうか?
$string = "aaaaa"; while ( $string =~ /a/g ) { print "aを見つけました\r\n"; }
pos($str) = //gc
即レスありがとうございました;;
perlのバージョンを5.10から5.12に上げたら、jcodeのエラーが出るようになった。
>defined(%hash) is deprecated at jcode.pl line 684, <DATA> line 855.
> (Maybe you should just omit the defined()?)
>defined(%hash) is deprecated at jcode.pl line 693, <DATA> line 855.
> (Maybe you should just omit the defined()?)
ttp://oshiete.goo.ne.jp/qa/6177617.htmlの人が似たようなエラーで 、
その部分を抜き出していた。
683: local(*s, $n) = @_;
684: &init_z2h_euc unless defined %z2h_euc;
685: $s =~ s/($re_euc_c|$re_euc_kana)/
692: local(*s, $n) = @_;
693: &init_z2h_sjis unless defined %z2h_sjis;
694: $s =~ s/($re_sjis_c)/$z2h_sjis{$1} ? ($n++, $z2h_sjis{$1}) : $1/geo;
5.12だと、perlのコードはそのまま使えないのでしょうか?
deprecated
普通に defined 〜 じゃなくて defined() って書いてね って話だと思う
perl56delta defined(@array) is deprecated (D) defined() is not usually useful on arrays because it checks for an undefined scalar value. If you want to see if the array is empty, just use if (@array) { # not empty } for example. defined(%hash) is deprecated (D) defined() is not usually useful on hashes because it checks for an undefined scalar value. If you want to see if the hash is empty, just use if (%hash) { # not empty } for example.
exists 使えって事か。
existsってundef代入しただけでもtrueが返るのか definedはfalseが返るけど
Windows7 64bit で、ActivePerl 64bit 使っているのですが、 (This is perl 5, version 12, subversion 2 (v5.12.2) built for MSWin32-x64-multi-thread) pipe を使った open に "%" という文字列が入っていると open に失敗してしまうようなのですが、 どなたか対策知りませんでしょうか? "%" が入っていなかったり、"%" が入っていても cygwin の perl(32bit 5.10.1) を使っていると問題が出ないのですが。 use FileHandle; my $arg = "%"; my $prog = new FileHandle; if (!$prog->open("something.exe \"$arg\"|")) { die "failed to exec"; }
Windows は % を使わないほうがいいよ。 たしか BAT での変数名とかだったような・・・
@array = 1 .. 100; @new; for( @array ){ my $r = rand @new+1; push(@new, $new[$r]); $new[$r] = $_; } 一番下がなにをしてるのか教えてください
下の二行でシャッフルでゲソ
>>838 だけど
pushの行と$new[$r]の行の下に print join " ", @new; を入れて @new の内容を見てみるとわかりやすいですよ
my @array = qw/a..z/; for(my $i = 0; $i <= $#array; $i++){ }
perlは先頭行に #user/bin/perl なコメントのソースファイル を当たり前のように見るけど、意味不明だ。
それは誰でもイミフだろうと思うがshebangでぐぐるといいよ
userは見たことないな、今のところ
文字列が数値に変換されるとき、前方の 0 は無視されると解釈してよろしいのでしょうか? my $x = "012"; print $x + 0; # => 12
その認識でok 文字列をちゃんと数値として解釈してほしいのであれば、oct関数を使うといいよ。
>>845 d
oct関数っていうのもあるんですね。
でも、oct関数を使うと、なぜか10になっちゃいます><
my $x = "012";
print oct($x); # => 10
>>843 間違えたuserではなくusrで、#の次に!が抜けてた
つ8進法
要するに、windowsでは不要なんだな。 シバンというヘッダーを全く付けずに作ってたが、unixではないから やはり正解だったんだな。 個人宅や職場でunixやlinuxなんか見ることないのに、コンピュータ技術 の分野ではwindowsを上回ってるかも知れないくらいに、コンピュータの プロの人は仕事で利用してるんだな。
active perlで起動させたたコマンドウインドウを、タスクトレイにしまう方法ってありますか? ずっと動かし続けるのに邪魔なので。
wperlというのがそれな筈なんだけど、うまくいかない
#の次に!だけでなく、usrの前に/も抜けてた
いいよお前以外分かってるから
http://ideone.com/D9Nqc CGI.pmで複数のcssファイル(index.cssとbase.css)を適用させようとして上記URLにあるコードを
書いたのですが、うまく二つとも適用されません。
どのようにすれば二つのCSSファイルを適用させることが出来ますか?
857 :
855 :2011/02/05(土) 16:46:45
use CGI; ↓ use CGI qw/:standard/;
859 :
855 :2011/02/05(土) 17:26:28
できました!なるほどー ありがとうございます!
WindowsでPerlやってる人いますか? MacやLinuxと違って注意するところはなんですか? CPANとか文字コードですか?教えて下さい
Macにもperlがあったか
Macにもあんだけどさあ なあ、前に ->矢印演算子がちょっとわからなかったからさあ (矢印演算子) C や C++ と同じように "->" は中置の被参照演算子です。 右側が [...], {...}, (...) のいずれかの形の添字であれば、左側は配列、ハッシュ、 サブルーチンへのハードリファレンスかシンボリックリファレンス (あるいは 技術的には、配列またはハードリファレンスが代入可能であれば ハードリファレンスを保持できる場所) でなければなりません。perlreftut と perlref を参照してください。 そうでなければ、右側はメソッド名かサブルーチンのリファレンスを持った 単純スカラ変数で、左側はオブジェクト (bless されたリファレンス) か クラス名でなければなりません。 perlobj を参照してください。 って言われたから perldoc.jp読む癖つけたわ まじperldocってさいこうなんだけど >右側はサブルーチンのリファレンスを持った 単純スカラ変数 これってさあ $sub=sub{'bakasinekiero'}; $obj->$subってことだろお? もうまじリファレンスもマスターしちゃったからさあ おれはPerlマスターなんじゃないかなあ
初めてのPerlだけでだいたいわかるよ あとはperldoc これだけオブジェクトPerlなんてかわなくていい
でも、Effective Perlは買おう
Effective Perlは第2版が出そうだから今は我慢してる
エキスパートCプログラミングのperl版みたいな本はないのかな
perlってサーバー上じゃないと動かないよね?C++やjavaに比べたら重いし遅いし不便だよね。
perl の歴史を無視とかw
>>867 お前PerlをPHPみたいなWEBでしか動かない言語と思ってないか?
.NETってきくだけでうさんくさい
perl.net
873 :
Perl忍者 ◆M5ZWRnXOj6 :2011/02/06(日) 18:43:15
869 :デフォルトの名無しさん:2011/02/06(日) 12:11:14 perl の歴史を無視とかw ↑ 爆笑
技術の最先端を追うには英語読めないとやってられないの?
875 :
デフォルトの名無しさん :2011/02/06(日) 21:12:32
DBIで$sth(ステイトメントハンドラ)からfinish()とすると Useless use of private variable in void context at test1.pl line 10. といわれるんですけど、これってやる必要ないのでしょうか? use strict; use warnings; use DBI; my $dbh = DBI->connect('dbi:odbc:test_dsn', 'test', 'test1'); my $sth = $dbh->prepare("SELECT * FROM TEST1"); $sth->execute(); while (my ($a,$b)=$sth->fetchrow_array) { print "a=$a, b=$b\n"; } $sth=>finish(); $dbh->disconnect(); こんな感じのコードです。perl -vはv5.10.1です。
=
× $sth=>finish(); ○ $sth->finish(); => であるか -> でないか
878 :
デフォルトの名無しさん :2011/02/06(日) 23:28:00
そういう意味だったですね。。。 すいませんでした。
879 :
Perl忍者 ◆M5ZWRnXOj6 :2011/02/07(月) 00:47:05
究極オブゴットオブバカス
880 :
Perl忍者 ◆M5ZWRnXOj6 :2011/02/07(月) 01:01:42
俺ってこんなクソコテだけどPerl(2ch)スレでは高レベル
881 :
 ̄ ̄ ̄ ̄)ノ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ :2011/02/07(月) 04:28:00
∧_∧ ( ´・ω・`) ∧_∧ / \ ( ) そうきたかwww .__| | .| |_ / ヽ ||\  ̄ ̄ ̄ ̄ / ..| | | ||\..∧_∧ (⌒\|__./ ./ ||. ( .) ~\_____ノ| ∧_∧ / ヽ.ワロス \| ( ) お前が言うと説得力あるなあww | ヽ \/ ヽ. | |ヽ、二⌒) / .| | | .| ヽ \∧_∧ (⌒\|_ .../ /
utf8で @file=('ファイル名 #テクスト(abc).d2v', 'ファイル名 #テクスト(abc).ts', 'ファイル名 #テクスト(abc) PID 110 DELAY -3ms.aac'); $filename=ファイル名 #テクスト(abc); が入力されていて ファイル名 #テクスト(abc) PID 110 DELAY -3ms.aac を取得するために foreach $j(@files){ print NEW "rem ".$j."\n"; if($j=~/$aacfilename.+aac$/){ } } としたのですが、取得できませんでした。 $filename=ファイル名 #テクストabc; @file=('ファイル名 #テクストabc.d2v', 'ファイル名 #テクストabc.ts', 'ファイル名 #テクストabc PID 110 DELAY -3ms.aac'); であれば、 ファイル名 #テクストabc PID 110 DELAY -3ms.aac をマッチさせることができました。 文字列に()が含まれている時でもマッチさせるにはどうすればよいでしょうか?
初めてperlが仕事で役に立ったよ
>>882 $j =~ s/([()])/\\$1/g;
lispスレでしたすみません
>>884 ,885
回答ありがとうございます。
そして、言葉足らずですみません。
$filenameに格納された文字列でマッチをさせたいのですが
どのようにすればよいでしょうか?
>>884 ,885
度々すみません。
$filenameに格納された文字列を含んで、aacも含む
条件でマッチさせたいです。
その時はどのようにすればよいでしょうか?
&&
$filename = "\Qfilename";
>>891 ,892
回答ありがとうございます。
if($j=~/\Q$aacfilename\E.+aac$/){
で期待通りの結果になりました。
これでファイル処理が楽になります
ありがとうございました。
うぜえ 正規表現ぐらいで質問してるやつ
今度OSをXPからwindows7に変えそうなのですが、win7でもactiveperlをインストさえしてしまえば、これまで書いた大抵のコードはXPのときと変わらず使えるでしょうか? ファイルの読み書き、コマンドプロンプトに文字を表示、文字列の操作や数値の計算などの簡単なものです あとはCPANでのモジュールのインストールなどです やり方を一新しないとモジュールのインストができない、とかはないですよね? 以前やってた時はコマンドプロンプトで perl -MCPAN -e shell install (モジュール名) のようにやってました
nmakeっていうやついれたほうがいいらしいぜ おれさあ Windows買ってからさあ CPANとかで導入するときエラー出てやる気うせるんだよね^^; だからWindowsでPerlやるのめんどくさいんだよね ichatのBOTつくろうとしたら モジュール入れるとき Linuxみたいに入らなくてやる気うせたんだよね^^; windows764bitだとnmake意味不明だったから^^;
Strawberry Perlはどうなの?
達人の方知恵をください。 引数の内容や数でサブルーチンの処理を動的に変えたいです。 例えば引数の和を返す場合に処理の部分をスマートに書く方法はありますか? add($a); add($a, $b); add(@c); add(\@d, \@e); sub add { 処理; return $ans; }
3つ目の配列にぶち込んだ方が楽っちゃ楽よね リファレンスはめんどくさいので考慮しないとしてw、 sub add{ my @data = @_; my $total = 0; foreach my $datum (@data){ $total += $datum; } return $total; } なんも考えずにざっと組むと、こんな感じ。
sub add { my$sum = 0; $sum += ref $_ eq "ARRAY" ? add(@$_) : $_ foreach @_; return $sum; }
902 :
899 :2011/02/09(水) 17:58:03
例として和を出したのですが、目的は足す処理ではなく 「引数の内容で処理を変えたい」です。 サブルーチンのプロトタイプ宣言が複数できれば簡単なのですが、perlでは無理みたいです。 sub add(\$) sub add(\$\$) sub add(\@) やはり引数に応じてサブルーチンを複数作るのがベストプラクティスなのでしょうか?
903 :
899 :2011/02/09(水) 18:10:54
>>901 型をチェックして処理を分けるイメージですね
引数のパターンをいかにチェックするかがキーなのか・・・
ありがとうございます、方向性が見えてきました。
>>899 use List::Util qw(reduce);
sub my_flatten { return map{ ref $_ eq 'ARRAY' ? my_flatten(@{$_}) : $_ } @_ }
sub add {
no warnings 'once';
return reduce{ $a+$b } my_flatten(@_);
}
Strawberry Perl良いんだけどactive scriptで動かないから結局AcrivePerl入れてしまう
906 :
デフォルトの名無しさん :2011/02/10(木) 00:14:01
ぐぐったけどわからなかったです perl初心者です mac です hello worldまで、実現したいです macは、はじめから、perlをはいっているとしりました どこにありますか? すいません
907 :
デフォルトの名無しさん :2011/02/10(木) 00:19:06
906です システムにありました 次は、helloworldをかきたいです 何のファイルを、使えばよいでしょう? たびたびすいません
>>903 規模にもよるけど、引数のセット毎に別のクラス作って実装するかな。
macってターミナルとかコマンドラインとかいわれてるやつあったっけ そこからperl -e "print qq/hello the world./;"とでもうちこんでみればどうか
こういうことをやりたかったのだろうか。 use Class::Multimethods; ... multimethod add => ('$', '$') => sub { ... }; multimethod add => ('ARRAY') => sub { ... }; multimethod add => ('$', 'ARRAY') => sub { ... };
条件演算子 ?= を使おうとしていますが、場合により結果が異なるのはどうしてでしょうか? my ($x, $y, @array); for (0 .. 1) { $array[$_] = $_; $array[$_] ? ($x = 1) : ($x = 0);#期待通りの結果 $array[$_] ? $y = 1 : $y = 0; #期待と異なる結果 print "array = $array[$_], x = $x, y = $y\n"; } 結果 array = 0, x = 0, y = 0 array = 1, x = 1, y = 0
perlop > Conditional Operator
>>911 $array[$_] ? $y = 1 : $y = 0;
だと、
($array[$_] ? $y = 1 : $y) = 0;
のようになっている気がする。
$array[$_] ? ($y = 1) : ($y = 0);
ておけば大丈夫…だが、そもそも
$y = $array[$_] ? 1 : 0;
と書けばなんてことはない。
914 :
デフォルトの名無しさん :2011/02/10(木) 08:49:45
>909 できた! thx! god bless you ,909
emacsでperlのコードを部分選択して C-c C-r で選択したところだけ評価したいのですが .emacsにいろいろ設定しないとだめなのでしょうか デフォルトでperl-modeやcperl-modeってのが入ってるみたいですが そのままでは上記のことができません
>>912 >>913 ありがとうございます。
>そもそも
>$y = $array[$_] ? 1 : 0;
>と書けばなんてことはない。
その通りなのですが、
実際は $array[$_] ? ($x = 1) : ($y = 0); のような処理なのです。
ワケワカランAAry
if使って書き直したいところだな
('b','c','a')をソートして、('a','b','c')と添字の順序(2,0,1)を得たいのですが、良い方法はありますか? 組込み巻数にはなく、サブルーチン自作でしょうか?
$i=0; map {$_->[1]} sort {$a->[0] cmp $b->[0]} map {[$_, $i++]} @list;
>>916 値を使う訳じゃないならわざわざ三項演算子で見づらくしなくても
if文でいいんじゃないかという素朴な疑問
922 :
919 :2011/02/10(木) 16:38:31
>>920 ありがとうございます
うまくできました
遅かったか。
>>919 my @array = qw( b c a );
my @order = sort { $array[$a] cmp $array[$b] } 0..$#array; # 2,0,1
my @sorted = @array[@order]; # qw( a b c )
my %sorted = map +($array[$_] => $_), @order; # (a=>2, b=>0, c=>1)
924 :
919 :2011/02/10(木) 18:42:12
>>923 ありがとうございます
こちらも保存しました
925 :
gfx :2011/02/10(木) 19:23:16
>
>>919 $i=if->aaa[100];
map printf "$i+++";
@list print;
$aa=qw/ /=qw/aaza/aa/a/a/aa/;
926 :
gfx :2011/02/10(木) 20:46:35
僕の株価がどんどんあがってますねw
927 :
gfx :2011/02/10(木) 20:54:24
みんな gfx++ してくださいねw
gfy
私は今まで、「\r=\x0D、\n=\x0A」と思っていたのですが、下記サイト↓に、
「Perlという言語の中で論理的に定義された復帰文字と改行文字です」
と書かれています。
Perlメモ
http://www.din.or.jp/~ohzaki/perl.htm#CRLF_Unify Windowsの場合、\n(=\x0A)はPerlIOを通過する時に(:crlfレイヤがあれば)\x0D-\x0A
に変換されると認識しておりました(入力の場合はその逆の変換)。
ただ、上記サイトの表に、Macの場合、
binmode FH;
print FH "\n"; # => \x0D を出力
と書かれています。
今のMacはUNIXベースなので、多分、改行は\x0Aだと思いますが、昔のMacは本当に
binmodeした時でも、\x0Dを出力していたのでしょうか?
もし、そうならば上記サイトで指摘されているように、「\r=\x0D、\n=\x0A」という
私の認識は間違いのような気がします。
>>930 ありがとうございます。
「\nは論理的な改行を表す」と書いてありますね。
1つ賢くなりました。
>Perl uses \n to represent the "logical" newline, where what is logical may
>depend on the platform in use. In MacPerl, \n always means \015 .
>In DOSish perls, \n usually means \012
932 :
http://blog.oricon.co.jp/benjo/ :2011/02/11(金) 10:26:54
rand 2 と rand * 2 はまったく同じですか?
違います 細かい小数点は省くけど rand(2) → 0 〜 1.99 rand() * 2 → (0 〜 0.99) * 2 = 0 〜 1.98 (ただし得られるのは2の倍数のみ) となります
>>933 その解釈も違うと思う。
>perl -we "print rand * 2"
Argument "*main::2" isn't numeric in rand at -e line 1.
0.849334716796875
>perl -we "$foo = 100; print rand $ foo"
79.45556640625
>perl -we "print rand 0"
0.341094970703125
Perl はプレフィクスとトークンの間にホワイトスペースが入ってもいいんだ。
内部的には同じことをしているのでは
>>934 最初のやつ、「2」が数値扱いされて
ないだろ?
「*2」としてrandの引数になってる。
% perl -E'srand(1);say rand(2); srand(1); say rand() * 2'
Mechanizeを使ったcgiに関する質問は、このスレでよろしいでしょうか?
Mechanize はもう飽きたなぁw
940 :
Perl忍者 ◆M5ZWRnXOj6 :2011/02/12(土) 09:07:09
プライベートメソッドのとき無名関数を使うんですが 後にかかないと エラーでちゃいます 無名関数はプロトタイプ宣言できないのでしょうか? package car; sub new{ my $self=shift; return bless({},$self); } my $punk=sub{ my $self=shift; print "punk!"; }; sub boo{ my $self=shift; print "booo!"; $self->$punk; } $punkを後に書くとエラーでます やはり前に書くしかないのでしょうか?
サブルーチンの場合は sub aa;みたいに やっぱり 無名関数は変数としてみるから前に書かないといけないんですか? 教えてください
変数ってなにかわかりますか?^^; レキシカル変数に無名サブルーチン代入してるじゃないですか 変数ですよこれ newの下か上に宣言しろよw そうすればその下のメソッドで利用可能になるから なのでsub $punk;なんてできません そのぐらいわかれよカス
>>941 質問内容と具体例が乖離してるぞ。
サブルーチンリファレンスにて
「プロトタイプ宣言出来るか?」
「プロトタイプの先行宣言出来るか?」
って質問なら、
前者は出来ない(宣言したつもりでも無視される)し、
後者も出来ない(シンタックスエラーになるか、したつもりになるだけ)。
==============
#!/usr/bin/env perl
use strict ;
use warnings ;
my $sub = sub ($) {} ; # 先行宣言したつもり
$sub->( q{hoge}, q{foo} );
$sub = sub ($) { printf "%s %s\n", @_ } ; # プロトタイプ宣言したつもり
$sub->( q{hoge}, q{foo} );
{
sub new { bless {}, shift }
my $foo ; # 先行宣言したつもり
sub echo{ shift->$foo }
$foo = sub{ printf "%s\n", shift } ;
}
main->new->echo ; # <= 先行宣言の検証にはなりえない。
==============
作りにくい設計は良くない設計
出力ファイルが既にあった時に、_1を付けて別の名前を付けるけど、 _1が付いたのも既にあったら_2を付ける的に順次増やしていく方法で ファイル名を決定するスマートなやり方は?
まっちんぐさせて 数値をインクリメント
>>946 命名規則の話?
ファイル検索ロジックの話?
「_1」を「_2」に置換するコードの話?
>>946 ループにして最初に存在しなかったファイル名で決定すりゃいいだけでしょ?
for(0..99){
my $fn = "hoge" . ($_ ? "_$_" : "");
if(-e $fn) {
print "${fn}は存在した\n";
}else{
print "${fn}は存在しなかったので決定\n";
last;
}
}
ちなみにlogrotateとは動き違うよ
俺のまねスンナ
Mechanizeの利用でつまづいています。
利用している無料サーーバーはPerlに対応しているのですが、
Mechanizeに対応しているかは分かりません。
Mechanizeのインストール方法は、下記のQ&Aの通りでいいのでしょうか?
http://oshiete.goo.ne.jp/qa/1680065.html 実際にやってみたのですが、cgiページを表示しても500エラーになります。
アップするフォルダや、cgiに書くフォルダ位置などを色々変えて試しましたが、
やはり動きません。
Mechanizeが使えるサーバーであるどうか、チェックする方法や、
初心者向けのインストール方法などが解説されたサイトはないでしょうか?
なるほど 三項演算子がうまく使えるな
>>949 決定したときには存在しなかったファイルが、作成するときには
すでに存在する。 そういう場合がある。
ロックぐらいするだろjk
決定したときには存在しなかったファイルが、ロックするときには すでに存在する。 そういう場合がある。
ファイル名を決定する手続きを排他ロックする って書けばよろしいでしょうか(笑
その方法も教えてくれればベター。
マルチコアのCPUだとそれでも失敗したり
ファイルハンドルを返した方が早そうだから、そうしてみた。 しかし、エロ画像に連番を振りなおす程度なら、ここまで仰々しいものは要らない。 use Fcntl qw(:DEFAULT :flock); use Errno; sub create_new_file { my ($name, $ext) = @_; my $file = "${name}.${ext}"; my $number = 1; return sub { while(1){ unless(-e $file){ if (sysopen(my $fh, $file, O_WRONLY|O_CREAT|O_EXCL)){ flock($fh, LOCK_EX); return $fh; } ($! == Errno::EEXIST) or last; } $file = "${name}_${number}.${ext}"; $number++; } die "cannot create file $!"; }; } my $create = create_new_file("foo", "txt"); my $fh = $create->(); ...
元の「スマートなやり方」からかなり遠くまで来てしまった
#use Exporter; #our @ISA = qw/Exporter/; #our @EXPORT = qw//; みたいにコメントアウトしても使えてるんだけど、これはこれで大丈夫なの?
作品のよさ>>>>>>>スマートとかコード美学>>>perl5の書き方 (笑)
>>959 O_EXCLしてるんだから、-eで調べなくてもいいんじゃねーの?
-eとopenの間に他のプロセスに割り込まれる可能性を排除
できないから-eあんま意味ないと思う。
今の設定を読み込む→変数の中身を変える→書き直す これの一連の作業を%PLAYER_LISTの全員に対して行いたくて下記のようにしているのですが、 これだとforeachで%PLAYER_LISTを2度回して(?)いてループを無駄にしていると思います。 ループを一度で終わらせる方法はないのでしょうか? foreach $id (keys %PLAYER_LIST){ &Ps_CONVERT($id); $PL_p[$qn]=0; open(PUSHLOG,">../$DBF/$nend/$DB_P"); flock(PUSHLOG, 2); print PUSHLOG "\%PLAYER_LIST=(\n"; foreach $key (sort {$a<=>$b} keys %PLAYER_LIST){ if($key ne $_[0]){ print PUSHLOG "\'$key\'=>\'$PLAYER_LIST{$key}\',\n"; } } print PUSHLOG "\"$_[0]\"=>\'@PL_p\',\n"; print PUSHLOG ");\n1;\n"; close(PUSHLOG); }
ファイルを開く前にロック出来れば問題解決出来るのになぁ。。。
966 :
956 :2011/02/13(日) 00:55:48
>>963 Windowsでは、同名のディレクトリがあるとEACCESを返すため。その対処。
967 :
959 :2011/02/13(日) 00:57:49
>>966 -eとopenの間にディレクトリ作られたらだめなので、EACCESが
返ったらディレクトリがあるかチェックしてエラーにするか次の
番号に進むか分岐するようなロジックにしないといかんのでは?
>>4 のテンプレート案なんですが、これ↓って
use open IO => ":encoding(cp932)";
binmode STDIN => ":encoding(cp932)";
binmode STDOUT => ":encoding(cp932)";
binmode STDERR => ":encoding(cp932)"; # ※1
まとめて、こう↓するのは、省略しすぎてわかりにくい?
use open qw/:encoding(cp932) :std/;
>>959 エロ画像に連番を振りなおす上に重要な仕事などない。
971 :
デフォルトの名無しさん :2011/02/13(日) 11:49:22
下記は12.plの中身です。下記を実行させると、 Can't locate object method "speak" via package "Mouse" at 12.pl line 13. が表示される。 具体的にどこが悪いのだろうか。SUPERが関係はしていると思いますが 分かりません。済みません。教えてください。 1 { package Animal; 2 sub speak { 3 my $class = shift; 4 print "a $class goes ", $class->sound, "!\n" 5 } 6 } 7 # same Animal as before 8 { package Mouse; 9 # same @ISA, &sound as before 10 sub sound { "squeak" } 11 sub speak { 12 my $class = shift; 13 $class->SUPER::speak; 14 print "[but you can barely hear it!]\n"; 15 } 16 } Mouse->speak;
973 :
デフォルトの名無しさん :2011/02/13(日) 14:35:23
971さんへ、動きました。有難うございました。助かりました。
974 :
デフォルトの名無しさん :2011/02/13(日) 14:36:19
972さんへ、動きました。有難うございました。助かりました。
>>968 -eとopenの間にディレクトリが作られたら何が駄目なの?
そういう場合はdieするだけじゃだめなの?
>>970 そんな仕事があるのか。世の中は広い…。
自分ではコード書かずに、ほんと、口ばっかりの奴でうんざりする。 ちょっとアレだったけど、ちゃんと回答してたperl忍者がマシに見えるわ。
ある変数$yを使って、$yに収納されている文字列を配列@wordsの中から探し出して取得した際に 取得した文字列があったところのインデックスを取得したいのですが、やり方を教えていだたけないでしょうか。
>>976 dieするんじゃなくて次の番号に行って欲しいと思うんだけどなぁ。
レアケースなのであきらめるというのもそれはそれでありだけど。
968のようにしたとしてもopenの直後にディレクトリを消されたら
同じような問題があって、結局アトミックに判定できない以上は
どこまで頑張るかの程度の違いでしかない。EACCESSを返すwindows
が一番悪いような気はするw
>>980 を超えるとdat落ちが早いので次スレを立てられる人お願いします
すみなせん すれたてれませんでしたすみなせん
my @founds = (); for(my $i = 0; $i < @words; $i++) { if($words[$i] =~ $y){ push(@founds, $i); } }
ほいさ 乙でした
968と987は会場のごみ広いとかイス片付けとか色々やったあと ほいさ、乙でした っていってそうだね
>>979 ,985
教えてくださってありがとうございます
この方法がわからずに行き詰っていたので、本当に助かりました