ログインしてさらにmixiを楽しもう

コメントを投稿して情報交換!
更新通知を受け取って、最新情報をゲット!

"へたれ"Perler友の会コミュのヘタレなPerlソースを晒すスレ

  • mixiチェック
  • このエントリーをはてなブックマークに追加
脱ヘタレの為に必要な物は何だ? 部門より

腐乱化曰く "世の中Perl好きな人は沢山居ますが、Perlをフルスクラッチで書けるPerlerに憧れるものの、実際には全然書けないヘタレな人も多いのではないかと思います。そういうヘタレな人が脱ヘタレのために必要なものは何か?ということを考えてみたところ、やはりヘタレなソースを晒しておかしいところを指摘してもらうのが一番ではないでしょうか。そこで、みなさんのヘタレなソースを晒して脱ヘタレの為に頑張る場所を作りたいと思います。"

某スラッシュドット風に書いてみました。
さて、思いつきでこんなスレッド作ってしまったものの、困った問題が1つ。
ミクシの掲示板はコメントで行頭の空白を保存しないというか、データとしては持っているけど、画面上は表示されないという問題が有ることに気が付きました。
shar形式で貼り付けないとダメかしら?ってことでそういうのを色々実験してみるスレッドでもあります。

コメント(110)

70のコメントを見ないうちに動作を推定して書いたのが次の奴。
多分コレで期待する動作だと思うんだけどどうでしょうか?

#!/usr/bin/env perl

@denylist = ('/ahaha/', '/ufufu/');

$line = "/hogehoge/sanisani/foo.cgi?hoge=1&sani=2&ahaha=3\t/ahaha/ufufu/\t/hogehoge/ahaha/\t/sanisani/sanihoge/\t/ufufu/hogehoge/";

@data = split(/\t/, $line);

foreach $url (@data) {
$denyflag = 0;
foreach $denyurl (@denylist) {
if($url =~ m/$denyurl/) {
print "DENY!:". $url . "\n";
$denyflag = 1;
last;
}
}
print $url . "\n" unless $denyflag;
}
>腐乱化…Flankerさん
おお。期待する動作です。
ありがとうございます。
参考にがんばってみます。
無事、期待通りの動作をするようになりました。
ありがとうございます。

>>70で張ったソースは、期待の動作をするものに置き換えました。
DBIには do というメソッドがあったのね…ってことでちょっと書き換え& select も試してみる。

#!/usr/bin/env perl
use strict;
use DBI;

my ($dbh, $i, $sth, @row);

$dbh = DBI->connect("DBI:CSV:") or die "Cannot connect: " . $DBI::errstr;
$dbh->do("CREATE TABLE a (c1 text, c2 text)");
for($i = 0; $i < 2; $i++) {
$dbh->do("INSERT INTO a VALUES (?, ?)", "", "1", "hello,world!");
$dbh->do("INSERT INTO a VALUES ('2', 'ahaha ufufu')");
}
$dbh->do("UPDATE a SET c2='foo bar' WHERE c1='2'");
$sth=$dbh->prepare("SELECT * FROM a");
$sth->execute();
while(@row=$sth->fetchrow_array) {
print "@row\n";
}
$dbh->disconnect;
__END__
とりあえず、strictを使ってないけど、問題なく動くちょっと、アレゲなソース
http://www.geocities.jp/do200x/cgi/dd.txt

# このCGIの置かれている場所をフルパスで入手
$this_dir_main = $0;
最初から違〜う(鬱)
# このCGIの置かれている場所をフルパスで入手
$this_dir_main = $ENV{'SCRIPT_FILENAME'};

|彡サッ
http://www.geocities.jp/do200x/cgi/dd2.txt
最新版がディスクにあった(鬱)
しかしながら、我ながら、他人行儀ではあるが、無駄な処理が多いなw
close<DAT>;をclose(DAT);にすれば動くと思います。

ただ、kyushu.dat が
--ここから
福岡県
大分県
佐賀県
長崎県
熊本県
宮崎県
鹿児島県
--ここまで
と1県ごとに改行されたデータだとしたら、

print"九州7県は\n";
open(DAT,"<kyushu.dat");
while(<DAT>){
print $_;
}
close(DAT);
print"です。\n";

でいいかなと思います。
elseif→elsif

最後に
}
がない。

後は文字コードによってはどっか変になるかも。
質問です。
#リンクが張られているURLを表示するプログラム#
use LWP;
use HTML::LinkExtor;

$url="http://genesicgao.hp.infoseek.co.jp/";
$browser = LWP::UserAgent->new;
$response = $browser->get($url);

$p = HTML::LinkExtor->new(\&callback,$url);
$p->parse($response->{_content});

sub callback {
my($tag, %links) = @_;
@link = @{[%links]};

print "$tag @link\n";
}

これを実行すると、リンクの張られているところのタグとURLを表示するのですが、このプログラムを拡張して、
a hrefで始まるタグのリンクだけを抜き出して、
HTML取得して内容を表示させたいのですが、
なかなかうまくいきません。
正規表現でタグの部分を削除させようと試みたのですが
配列はだめです、みたいなかんじで怒られたり。。。
なにかいい方法があれば教えてください(><)
コードを手元で動かしていないので憶測になりますが、
print "$tag @link\n";の出力がたとえば

A http://www.yahoo.co.jp/ http://www.google.com/
IMG http://hogehoge.com/hoge.gif

なんて風なのだとしたら、

my($tag, %links) = @_;
return unless $tag =~ /a/i;
@link = @{[%links]};

なんて追加して、Aタグ以外の場合はsub callbackから抜けるようにしたらいかがでしょう?
検索をするための物を作ったのですが解決方法を教えていただけたらと思ってます。
元々、数字や英字を検索するために作ってました。

[A]は最初に本を読んで改造した物です。
正規表現なので eval $category_check; で実行するとちゃんと起動してますが
カタカナの「ー」が入った文字
例えば、「オート」「サンプラー」「イトー」は検索されません。
[B]を試したもののこちらは全く動きません。
最終手段として[C]になってしまいました。
[C]はカタカナの「ー」でも問題なく動くのですが、10個のワードが限界というのが問題あるような気がします。
なるべく[B]に近い形で動かしたいと思っているのですがどうするのが良いと思われますか?

先ほどまで悩んでいたのですが
$aaa =~ s/%([0-9a-fA-F][0-9a-fA-F])/pack("C", hex($1))/eg;
で変換した後、検索し、10個区切りの移動の所にアドレスの後に $aaa を追加して
再び検索しているのですがカタカナの「ー」は「%81」になるところ「%81[」になり
「[」を削除しようとしたのですが「?」になったり上手く出来ません。「?」は英字のハテナとは微妙に違うようです。
結局、変換を16進数しました。
もしかしたら、カタカナの「ー」が「%81[」になってるせいで[A]で検索されないのでは無いかと考えてます。
上手く解決する方法をご存知ではないでしょうか?


http://www.gl-sciences.jp/cgi-bin/search.cgi
[A]
$category_check = 'if ( ( $bb =~ /';
$category_check .= join ( '/i ) && ( $bb =~ /' , @aaa );
$category_check .= '/i ) ) {';
$category_check .= 'push (@cc, $bb );';
$category_check .= '}';


[B]
$category_check = 'if ( ( index ( $bb,';
$category_check .= join ( ') != -1 ) && ( index ( $bb, ' , @aaa );
$category_check .= ') != -1 )) {';
$category_check .= 'push (@cc, $bb );';
$category_check .= '}';

http://www.gl-sciences.jp/cgi-bin/search2.cgi
[C]
if (
( index ( $bb, $aaa[0] ) != -1 ) &&
( index ( $bb, $aaa[1] ) != -1 ) &&
( index ( $bb, $aaa[2] ) != -1 ) &&
( index ( $bb, $aaa[3] ) != -1 ) &&
( index ( $bb, $aaa[4] ) != -1 ) &&
( index ( $bb, $aaa[5] ) != -1 ) &&
( index ( $bb, $aaa[6] ) != -1 ) &&
( index ( $bb, $aaa[7] ) != -1 ) &&
( index ( $bb, $aaa[8] ) != -1 ) &&
( index ( $bb, $aaa[9] ) != -1 )
) {
push (@cc, $bb );
$hit_count++;
}
>せおさん
どういうことがやりたいのかいまいち理解していないのですが…(苦笑
こういう感じの話ですかねぇ?
なんとなくShift_JISで2バイト目が\になる文字だと誤動作するとかそういう系統のような気がしますが…

#!/usr/bin/perl
use strict;
use warnings;
my @tt = <DATA>;
my $st = $tt[0];
chomp $st;
shift @tt;
for(my $ct = 0; $ct < scalar(@tt); $ct++)
{
my $tc = $tt[$ct];
chomp $tc;
print index($tc, $st) >= 0 ? "OK " : "NG ", $tc, "\n";
}
__DATA__
ソート
漢字文字列のソートとかをテストしてみます。
他の文字列はどうだ?
例えばソートとか
例えばhogeとか
例えばソーのソートのソートとか
>腐乱化…Flankerさん
説明下手ですいません。
[A] の正規表現を使い && の if 文を自動生成してるのが一番スマートな気がしてるだけなんです。
最終手段として検索インデックス自体を16進数にして、
検索ワードも16進数にしてしまおうかと思ってます。
for分の部分試してみます。
ソート関係は全くやってなかったですが考えてみます。
えぇと…この場合ソートはあまり関係ないです。
#テスト文字列として選んだだけなので。
「ー」が含まれると動作しないというのはおそらくShift_JISのコードで2バイト目が\になるのでその次のバイトとあわせてエスケープシーケンスとして処理してしまう為に誤動作するということでは無いかと思います。
#if文の自動生成なのでこの影響が出ているんですね。
で、影響を無くす為にはif文の自動生成をやめるのが一番手っ取り早いと思うんですがどうでしょうかねぇ?
#[C]が動作するのはif文を自動生成していないからだと思います。
jperlを使うという手も有りますが、バージョンの問題とかレンタルサーバだとインストールできないとか色々問題もありますから非推奨ですね。
スイマセンちょっと間違えていたかも(汗
Shift_JIS で2バイト目が\になるのは「ソ」ですね。
修行不足でした orz
webフォームなのでURLエンコードされた文字列の問題かもしれませんね。
>腐乱化…Flankerさん
自動生成は無理なんすね、残念です。
無理かもしれませんが jperl は確認してみます。
URLエンコードがやはり問題っぽいですよね
正規表現で固定文字列を検索したい場合は
quotemeta したものを正規表現文字列に埋め込みましょう。

$pattern = join('|',map{quotemeta}@words);
$category_check="push(\@cc,\$bb) if $bb =~/$pattern/;";
(試してないけど)

また、マルチバイト文字列から検索する際はマルチバイト文字の境界を意識することが必要です。sjisの例は手元にありませんが、EUC-jpの場合は
http://www.din.or.jp/~ohzaki/perl.htm#JP_Match が参考になるでしょう。
>tateisuさん
ありがとうございます。
mapとquotemetaは知らなかったのですが、リファレンス見てみたらquotemetaした方が安全すね。

マルチバイト文字の境界を作るというは参考になりました。
試してみます。
あ、そうそう。
ものすごく今更だけれど、役に立てばなと。

↓エスケープしないと化ける文字一覧
噂欺圭構蚕十申檜箪浬貼能表暴予禄


まだあるけど日本語じゃないですのでこれだけコピペしてファイルにでも保存しとけば良いんじゃないかなと、思います
質問です。
2 記事 のような コピー
3 記事 のような データ収集
1 記事 のような ニュース
1 記事 のような ネタ
1 記事 のような パレットづくり
1 記者 のような エリート
1 記者 のような オジサン
1 記者 のような 外側
2 記者 のような 仕事
2 記者 のような 無粋
1 記者 のような 明敏さ

という、元データ(数字 A のような B)
を A 別に数字で並びかえて、その数字が高い上位2つの行を出力するというプログラムを組みたいのですが、どのようにすればよいのでしょうか?初心者でよくわかってません;;

#!/usr/local/bin/jperl

print "intput file :";
chomp($filename = <STDIN>);
$outfile = "top2.txt";
open(IN,$filename);
open(OUT,">$outfile");
@line = <IN>;
for($i=0;$i<@line;$i++){
$line[$i] =~/\s(.*)\s(.*)\s(.*)\s(.*)\s/;
$num = $1;
$num1 = $1;
$A1 = $2;

$line[$i+1] =~/\s(.*)\s(.*)\s(.*)\s(.*)\s/;
$A2 = $2;
$num2 = $1;

if($A1 eq $A2){
if($num2 > $num1){
$line[$i] =~/\s(.*)\s(.*)\s(.*)\s(.*)\s/;
$B = $4;
print OUT "$num2\t";
print OUT "$A1 のような $B\n";
}
}
}
close(IN,OUT);
へたれすぎていてすみません。
@category = ("ニュース","インターネット","プログラム","日記","独り言");
みたいな配列があって、
$in{'category'}からは、そのカテゴリーの何番目かがやってきます。(cgi-lib.plで…)
アホなことに配列がゼロから始まるのを忘れていて、途中で1を引いています。。。とほほ。

foreach (@category) {
if ($_ == ($in{'category'} -1)) {
$category_number = $in{'category'} - 1;
$ex_category = $category["$category_number"];
}
}

しかし、$in{'category'}には確かにちゃんと数字が入ってくるのですが、$category_numberには数値が入らないのです。
ハッシュで計算するなんてことは、ちょっとはじめてなので、ハッシュには文字列しか入らない…なんて思いましたが、そんな筈ないですよね?
$in{'category'} の値が1の時、つまり配列の一番最初の"ニュース"の場合は、$ex_categoryに"ニュース"が代入されるのですが、それ以降の数字(2~)が計算されていないようなのです。

これはどういったことかわかる方がいらしたらおしえてください!
よろしく願いします。
あほたれな書き方をしてしまいました。。。
@category = ("ニュース","インターネット","プログラム","日記","独り言"); があって、この中のどれかを指定するために、$in{'category'}には番号が入ってやってきます。(cgi-lib.plを使って)
これで、どうやって「ニュース」とか「インターネット」とかを表示できるにようにすればよいのか、迷いに迷っていました。

たしかに、「やろうとしていることの意味がわからない」ということになると思いました。
と、いうのは、$caterory[$in{'category'}]だけで取得できるからです。相当に思い悩んだのに、これだけの話でした。すみません。

(本当を言うと、1〜の番号を振ってしまったために、$caterory[$in{'category'}-1]で正常にカテゴリーを取得できました。
 自分でも何をやっていたのだろうという感じです。

 しかし、いろいろ喋ってみて勉強になりました。ありがとうございます。


>103 とりすけさん

「能」勢電鉄 と「表」示 をうちのサイトのPerlで使わねばならずいちいち
$hyou = '表';

print 云々EOF

ページを$hyou示

とかやってるorz。

ログインすると、残り86件のコメントが見れるよ

mixiユーザー
ログインしてコメントしよう!

"へたれ"Perler友の会 更新情報

"へたれ"Perler友の会のメンバーはこんなコミュニティにも参加しています

星印の数は、共通して参加しているメンバーが多いほど増えます。

人気コミュニティランキング