Perlコーディング初心者質問スレ Part 58
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2008/08/06(水) 22:54:32ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ http://pc11.2ch.net/test/read.cgi/php/1203935151/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0497nobodyさん
2008/12/12(金) 23:14:49ID:???http://search.cpan.org/search?q=speech&m=all&n=100
http://search.cpan.org/search?q=speak&m=all&n=100
0498nobodyさん
2008/12/12(金) 23:59:34ID:t4dUYMwZたとえばABCという文字の1番目と3番目を替える場合
$hoge = "ABC";
$s1 = substr($hoge,1,1)
$s2 = substr($hoge,3,1)
0499nobodyさん
2008/12/13(土) 00:01:31ID:???$hoge = "ABC";
$s1 = substr($hoge,1,1);
$s2 = substr($hoge,3,1);
substr($hoge,3,1) = $s1;
substr($hoge,1,1) = $s2;
で、できると思いますが、もっとスマートなやり方はないでしょうか?
0500nobodyさん
2008/12/13(土) 00:20:33ID:???$hoge = "ABC";
$s1 = substr($hoge,1,1);
substr($hoge,1,1) = substr($hoge,3,1,$s1);
0501nobodyさん
2008/12/13(土) 00:24:19ID:???0502nobodyさん
2008/12/13(土) 00:29:52ID:???ちなみに君の書いたコードだとACB
0503nobodyさん
2008/12/13(土) 00:42:46ID:???$hoge = reverse $hoge ;
じゃなきゃ
substr $hoge, 0, 3, reverse substr $hoge, 0, 3;
ちゅー手も。
0504nobodyさん
2008/12/13(土) 00:51:10ID:???深夜ありがとうございます。
文字数は非固定で、入替える文字もランダムですので、正規表現は無理そうです。
>>ちなみに君の書いたコードだとACB
確認せず書いてすみませんでした。
$hoge = "ABC";
$s1 = substr($hoge,0,1);
substr($hoge,0,1) = substr($hoge,2,1,$s1);
ですね。
もうちょっと考えてみます。
0505nobodyさん
2008/12/13(土) 01:01:23ID:???0506nobodyさん
2008/12/13(土) 15:58:49ID:???Perl が来た時代なんてあったのか?
0507nobodyさん
2008/12/13(土) 19:27:09ID:???ttp://www.hamakin.net/search/my_page_rank.html
このツールみたいに演算中に「演算中」と出しておいて終わったら
結果を表示したいのですがわかりません。。
これみたいなキーワードチェックツールを作っていてツール自体は
作れそうなのですが、「演算中」表示が解決できず困っています。
本当は、「演算中」ではなく、「10位まで終了」「20位まで終了」
としたいのですが、どちらもさっぱりで。。
0508nobodyさん
2008/12/13(土) 19:36:16ID:???だいたい、本当にそんな時間かかってるなら鯖の負担が大変だw
0509nobodyさん
2008/12/13(土) 20:08:28ID:???substr($hoge, 0, 1, substr($hoge, 2, 1, substr($hoge, 0 , 1)));
無理に文字列で操作しなくても、配列で操作してもいいんじゃないか。
my @hoge = split //, $hoge;
@hoge[0, 2] = @hoge[2, 0];
$hoge = join('', @hoge);
実際の操作が一回ならアレだけど、複数回適用するなら配列の方が楽。
0510nobodyさん
2008/12/13(土) 20:44:38ID:???すごいの?
レンタルサーバでやろうとしてたんだけど、迷惑かな。。
0511nobodyさん
2008/12/13(土) 21:10:00ID:???どうでもいいが
0512495-500
2008/12/13(土) 21:25:19ID:???配列の案までありがとうございます。
substr($hoge,0,1) = substr($hoge,2,1,substr($hoge,0,1));
で一行にまとめたのですが、
substr($hoge, 0, 1, substr($hoge, 2, 1, substr($hoge, 0 , 1)));
なんて事までできるのですね。
どれが一番よいかベンチとって、使用したいと思います。
0513nobodyさん
2008/12/13(土) 21:32:03ID:???ソースみるとjavascript使ってないんです。いっこも。
perlかどうかは分からないんですが。
「10位まで終了」「20位まで終了」 ってのは無理なのかな。。
0514nobodyさん
2008/12/13(土) 22:44:05ID:???見たけど、本来直接結果を表示できるところを、演算中と表示させるだけのcgiを間にはさんでしばらく表示し、
metaタグで結果ページのcgiに移動しているだけのようですね。フォームデータはそのまま結果ページcgiに渡すと。
★が動くのはアニメgifでしたよ。ワンクリ詐欺の技法。
まともに経過を表示させる方法を書こうと思ったけど、板違いなのでやめました。Webprog板へどうぞ。
0516nobodyさん
2008/12/14(日) 14:24:32ID:???514さま。感謝です!演算中表示はできましたです!
cgiをはさむってのは思いつきませんでした。
板違いでなければ、経過表示もお願いしたいのですが。。
あと、共有サーバでやるべきかどうか、どう思いますか??
0517nobodyさん
2008/12/14(日) 17:10:12ID:???後者はperldoc -fで出るけど前者は出ないしググっても全然情報がないす
0518nobodyさん
2008/12/14(日) 17:26:46ID:???ここにある chm とかサクっと検索できるし見てみるのどうよ
wantarray は、perlfunc に書いてあるね。
stringify は、各モジュールで勝手に文字列化するためのメソッド定義してるとかじゃね。
0519nobodyさん
2008/12/14(日) 17:31:24ID:???ありがとうございます、探してみます。
stringifyはcatalystで $c->path_to('hoge/huga')->stringify とかしたときのが知りたかったのでcatalystのソース読んでるところでした
0520nobodyさん
2008/12/14(日) 17:39:22ID:???その path_to のなかでつかってる Path::Class::Dir, Path::Class::File に
それぞれ stringify メソッドが定義されているよ。
0521nobodyさん
2008/12/14(日) 17:46:22ID:???依存モジュールが無いのでこの程度なら頑張れば読めそうっす
ありがとうございました。
0522nobodyさん
2008/12/14(日) 17:48:41ID:???0523nobodyさん
2008/12/14(日) 18:06:05ID:???あとは、初めて目にするモジュールがあれば、
CPAN で検索してみればいいんじゃないかと思う。
http://search.cpan.org/
死にゆく言語だががんがってくれ!
0524nobodyさん
2008/12/14(日) 18:22:07ID:???0527nobodyさん
2008/12/16(火) 13:59:20ID:vcMtnNeb以下のように "?" でURLとパラメータを区切ると思います。
http://server/path?name1=value1&name2=value2
しかし、あるサイトでは"?"を使わずに"/"が区切り文字になっているようです。
http://server/path/name1=value1&name2=value2
このような記法は普通に利用されるものでしょうか?
詳しく解説しているサイト(RFC)等がありましたら教えて下さい。
0528nobodyさん
2008/12/16(火) 14:21:14ID:???0530nobodyさん
2008/12/16(火) 14:30:11ID:???スレ違いスマソ
0533532
2008/12/16(火) 16:02:23ID:???0534nobodyさん
2008/12/16(火) 17:47:44ID:???【Apache】mod_rewriteについて語るスレ
http://pc11.2ch.net/test/read.cgi/php/1023791370/
探せばどっかに答えがあるというか、ほとんどその類の質問しかないスレ。
0535nobodyさん
2008/12/16(火) 20:34:45ID:???もしくはoverloadを有効に使っているモジュールを教えてください。
0536nobodyさん
2008/12/16(火) 21:24:29ID:???0537nobodyさん
2008/12/16(火) 21:26:06ID:???http://search.cpan.org/dist/perl-5.10.0/lib/overload.pm
http://perldoc.jp/docs/perl/5.6.1/overload.pod
0540nobodyさん
2008/12/25(木) 22:41:08ID:???http://www.google.co.jp/m?eosr=on&q=hoge&site=mobile&mrestrict=chtml&start=0&sa=X&oi=blended&ct=more-results
の、検索結果に引っかかったURLを抽出しようと、以下のコードを書きました。
my $url = 'http://www.google.co.jp/m?eosr=on&start=0&site=mobile&sa=N&mrestrict=chtml&q=hoge';
my $scraper = scraper {
process '.padbottom a', "link[]" => '@href';
process '.sftr a', "next" => '@href';
result qw/link next/;
};
my $uri = new URI($url . $word);
my $scraped = $scraper->scrape($uri);
for my $u (@{$scraped->{link}}) {
print "$u\n";
}
結果は、10件の検索結果に加え、「次の10件」と「PCサイトを見る」のリンクまで取れてしまいました。
検索結果のクラスは<div class="padbottom">で、「次の10件」と「PCサイトを見る」のクラスは<div class="sftr center">なのに、何故この余計な二つが取れるのでしょうか?
どうすればこの余計な二つを除いた結果が取得できますか?
0541nobodyさん
2008/12/28(日) 03:49:15ID:???って書けばよさそう。
いろいろ省かずに動くコードを gist に貼ってよ。
0542nobodyさん
2008/12/30(火) 07:46:25ID:???webブラウザにアドレスを入れて、CGIを直接叩いているのですが、HTMLを返さないので、
ちゃんと実行されるものの、当然500エラーになります。
シェルから走らせてるか、HTTPで走らせてるかを判別できるような環境変数などはありますか?
0543nobodyさん
2008/12/30(火) 08:02:24ID:???0545nobodyさん
2009/01/11(日) 00:46:35ID:???携帯メールの添付ファイルをimagemagickで変換→送信元へ返信
2: それでこんな風にやってみたが・・・
A.メール受信してスクリプトを起動(実装済)
B.添付ファイルを抽出
C.添付ファイルをimagemagickで変換
D.変換後添付ファイルを送信元へ送信
(BCDは同一モジュール)
3: こんなエラーが出て上手く行かなかった。
Bの添付ファイルを抽出する処理において、ひとまず添付ファイルを出力してみようとしたところうまくいきません。
変更前(テンポラリファイルを作成するバージョン)はうまくいくのですが、$parser->output_to_core(1);にすると
うまく動きません(正常終了するけどファイルは作られない)。単純にoutput_to_core(1);とするだけではだめなのでしょうか?
#!/usr/bin/perl
use File::Basename;
use MIME::Parser;
my $parser = MIME::Parser->new
#$parser->output_dir('/tmp'); ←コメントアウト
$parser->output_to_core(1); ←追加
my $entity = $parser->parse(\*STDIN);
if($entity->is_multipart){
$count = $entity->parts;
for($i = 1; $i < $count; $i++){
$path = $entity->parts($i)->bodyhandle->path;
$filename = (fileparse($path))[0];
open(FILE, "> /var/spool/mail/mail/$filename");
print FILE $entity->parts($i)->bodyhandle->as_string;
close(FILE);
}
}
http://www.ksknet.net/cat28/mimeparser.html
0546nobodyさん
2009/01/11(日) 23:01:08ID:lrs+Aq7Aどうすればいいですか?
#!/usr/bin/perl
use strict;
use Win32::Clipboard;
$| = 1;
my $clip = Win32::Clipboard();
$clip = $clip->GetText();
foreach (split(/\n/,$clip)) {
print $_;
sleep 1;
}
exit;
0547nobodyさん
2009/01/11(日) 23:10:54ID:???0548nobodyさん
2009/01/11(日) 23:52:30ID:lrs+Aq7Aどうしてだろう。
0549nobodyさん
2009/01/12(月) 00:50:30ID:???\nでsplitしたんだからそりゃそーでしょう。
print "$_\n";
0550nobodyさん
2009/01/12(月) 00:55:25ID:???何故かパイプが全角だった。,とか\は半角なのに。
perl-5.8.8-15.el5_2.1
0552nobodyさん
2009/01/12(月) 01:24:58ID:???バージョンによって違うのかねぇ。
0553nobodyさん
2009/01/12(月) 01:27:12ID:???でも\rだけで改行されんのかな
0554nobodyさん
2009/01/12(月) 01:55:27ID:???splitかけても、各行の最後に\x0dが付いていた。
結果、左に復帰するけど、下にフィードしない。
ただし、1秒ごとに出力はされる。
という感じです。
0555nobodyさん
2009/01/12(月) 10:07:30ID:???指摘されたように、print "$_\n";で応えてくれたので、
\r\nでsplitしました。
0556nobodyさん
2009/01/14(水) 11:55:48ID:OW2Unehdとある UFT-8 のファイルのデータを使って CSV ファイルを書き換えたいと思います。
そこで, まずCSV を読み込もうと
http://www.din.or.jp/~ohzaki/perl.htm#CSVwithCRLF
を参考に以下のソースを実行したのですが、何度やっても
「問題が発生したため、Perl Command Line Interpreter を終了します。 ご不便をおかけして申し訳ありません。」
というエラーが出て終了してしまいます。
+++++ソース+++++
use utf8;
use Encode;
open(DATA, '<', $entry_data_file) or die "entry_data does not exist.";
while (my $line = decode('CP932', <DATA>)) {
$line .= decode('CP932', <DATA>) while ($line =~ tr/"// % 2 and !eof(DATA));
$line =~ s/(?:\x0D\x0A|[\x0D\x0A])?$/,/;
@values = map {/^"(.*)"$/s ? scalar($_ = $1, s/""/"/g, $_) : $_}
($line =~ /("[^"]*(?:""[^"]*)*"|[^,]*),/g);
}
close(DATA);
+++++++++++++++++++
decode の仕方がいけないのでしょうか??
教えてください!!
0557556
2009/01/14(水) 12:12:28ID:OW2Unehdサイズが大きすぎるということではないと思うのですが、
何か分かれば教えてください!
0558nobodyさん
2009/01/14(水) 12:37:25ID:???あとはbinmode(DATA)もやってみてはどうだろう。
EUCの場合も試してみては?
0559nobodyさん
2009/01/14(水) 12:47:48ID:???ここの行がだめな気がする
0560nobodyさん
2009/01/14(水) 13:32:39ID:???環境晒したほうがいいかもね。windowsっぽいメッセージなので俺は力になれ
んと思うけど。
558の言うようにbinmode使えというのは同意。IOレイヤ使った方がいちいち
自前でencode書くよりすっきりするよ。元のプログラムいじるとこも最小限に
なるし。
0561nobodyさん
2009/01/14(水) 17:04:33ID:???0562nobodyさん
2009/01/14(水) 17:10:52ID:???0563nobodyさん
2009/01/14(水) 17:13:41ID:???0564nobodyさん
2009/01/14(水) 17:38:35ID:???0565nobodyさん
2009/01/14(水) 18:25:51ID:???0567nobodyさん
2009/01/14(水) 19:02:59ID:???OSがWindowsなら、ローカルで動かしてるか専鯖なんだろうし、
ファイルを全部読んでからText::CSV_XSで処理した方が楽だろう。
0568nobodyさん
2009/01/14(水) 19:27:44ID:???満たさずにループから抜けるだろ
0569nobodyさん
2009/01/14(水) 19:32:15ID:???呆けてた。
0570nobodyさん
2009/01/14(水) 20:11:53ID:???これって decode の結果がループ条件でしょ?
ここを
while (my $line = <DATA>){
my $utf8str = decode('CP932', $line);
みたいに分けたほうが・・・
あと、<DATA> で回してるのに、その中で <DATA> で読み込むのはやめた方がいい
これは作り方が間違えてるとしか・・・
0571nobodyさん
2009/01/14(水) 20:55:18ID:???0572nobodyさん
2009/01/14(水) 21:10:32ID:VxBaEqTh0573nobodyさん
2009/01/15(木) 05:26:19ID:???0574nobodyさん
2009/01/16(金) 14:34:05ID:???動作環境が悪いのか
都市伝説が原因か
謎は深まるばかりです。
0575nobodyさん
2009/01/17(土) 23:31:05ID:???0576nobodyさん
2009/01/17(土) 23:48:40ID:???イメージ的にはこんな感じです。
package main;
sub Hoge::say_hoge = sub say_hoge {warn "hoge\n"}
Hoge::say_hoge();
0577nobodyさん
2009/01/18(日) 00:35:38ID:???#!/usr/bin/perl -w
use strict;
package Foo;
sub Bar::speak { __PACKAGE__, ' says ', uc pop, "\n" }
package Bar;
sub Foo::speak { __PACKAGE__, ' says ', lc pop, "\n" }
package main;
print Foo::speak('FOO'), Bar::speak('bar');
__END__
ただしこんな事をしなければいけないようなら設計が悪い。
0578nobodyさん
2009/01/18(日) 00:42:15ID:???0579nobodyさん
2009/01/18(日) 00:42:29ID:???0580nobodyさん
2009/01/18(日) 02:00:40ID:???code => sub {warn "hoge\n"},
into => 'Hoge',
as => 'say_hoge'
});
0582nobodyさん
2009/01/18(日) 14:33:21ID:???0584nobodyさん
2009/01/18(日) 23:39:26ID:???a
b
c
2.txtの中身
d
e
f
↓一行おきに2.txtの中身を挿入したい
a
d
b
e
c
f
先生教えて!
0585nobodyさん
2009/01/19(月) 00:00:53ID:???use warnings;
use FileHandle;
my $a = FileHandle->new("< a.txt");
my $b = FileHandle->new("< b.txt");
while (!$a->eof && !$b->eof) {
print $a->getline;
print $b->getline;
}
0586nobodyさん
2009/01/19(月) 00:20:53ID:???0587nobodyさん
2009/01/19(月) 00:46:38ID:???FileHandle なり何なりを使わない場合の利点があれば教えて欲しい。
0589nobodyさん
2009/01/19(月) 00:52:38ID:???0591nobodyさん
2009/01/19(月) 01:02:16ID:???use strict;
use warnings;
open my $txta, '<', 'a.txt' or die 'not found a.txt';
open my $txtb, '<', 'b.txt' or die 'not found b.txt';
while (defined (my $ta = <$txta>) and defined (my $tb = <$txtb>)) {
print $ta;
print $tb;
}
0592nobodyさん
2009/01/19(月) 08:55:47ID:???use strict; つけることすら無駄になるよね。
どうなのそれ。
0593nobodyさん
2009/01/19(月) 09:02:22ID:???0594nobodyさん
2009/01/19(月) 09:08:59ID:???strictはプラグマだから負荷かからないと思ってたけど違うの?
数値的にどれくらい負荷になるの?
0595nobodyさん
2009/01/19(月) 09:09:55ID:???use strict してなくてもかまわんかもしれんなw
0596nobodyさん
2009/01/19(月) 09:21:58ID:???以下コピペするよ
> ところで、気になるオブジェクト指向実装における Perl スクリプトの実行
> 速度ですが、Damian Conway 氏による『オブジェクト指向Perlマスターコー
> ス―オブジェクト指向の概念とPerlによる実装方法』の序章にこうあります。
>
> > 一般には、オブジェクト指向Perlによるシステムの実装は、それと等価の
> > 非オブジェクト指向実装よりも高速になることはなく、実際には比較して
> > 通常20〜50パーセントほど低速になる。
> > この数字はオブジェクト指向Perlから多くのユーザを遠ざけるほど十分に
> > 大きいかもしれないが、オブジェクト指向の設計面および実装面のそれを
> > 補うさまざまなり点を見逃すのは悲劇的である。
> > (中略)
> > 残念ながら多くの人は、「20〜50パーセントの低速化」という数字に惑わ
> > され、過去6か月間でプロセッサ速度が2倍になったにもかかわらず、何を
> > 意味しているか忘れがちになる。
■ このスレッドは過去ログ倉庫に格納されています