Perlコーディング初心者質問スレ Part 47
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/03/01(水) 15:39:31ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0685nobodyさん
2006/04/15(土) 15:21:49ID:???0687nobodyさん
2006/04/15(土) 16:11:35ID:c44RBImj0688nobodyさん
2006/04/15(土) 16:14:12ID:???0689nobodyさん
2006/04/15(土) 18:06:11ID:c44RBImj0690nobodyさん
2006/04/15(土) 18:07:08ID:???0691カシス
2006/04/15(土) 18:44:04ID:???自作Perl・CGIで作るマガをwebを通して発行する。
outlook2000で見ると改行できない。
他のbeckyとかoutlookexpressならちゃんと改行出来ている。
・・・そこで一度FTPを通してアップするとちゃんと改行出来ている。
自分PerlもCGIも詳しくないのでナゼなのかわからないのです。
CGI・Perlの両方のデータ持ってるんで誰か心優しい方教えてください。
0692nobodyさん
2006/04/15(土) 18:46:15ID:???0693nobodyさん
2006/04/15(土) 18:58:32ID:c44RBImjJPG、GIF、および PNG 画像を、単にピクセル リサイズではなく、きれいに縮小してくれる Perl モジュールを探しています。
0694nobodyさん
2006/04/15(土) 19:04:10ID:???0695nobodyさん
2006/04/15(土) 19:04:11ID:???0696nobodyさん
2006/04/15(土) 19:32:16ID:???0697nobodyさん
2006/04/15(土) 20:24:26ID:q8gKpXSp「なんでそんなこと考える必要がある?代替法を考えてやるから、やりたいことを書いてみろ」というのではなく、所期の目的を達成する方法だけを教えてください。
0699nobodyさん
2006/04/15(土) 20:37:39ID:q8gKpXSp0700nobodyさん
2006/04/15(土) 20:44:07ID:???print $yamada;
0701nobodyさん
2006/04/15(土) 20:44:33ID:???0702nobodyさん
2006/04/15(土) 20:49:22ID:???0703nobodyさん
2006/04/15(土) 20:53:54ID:???0706nobodyさん
2006/04/15(土) 22:23:24ID:???爆笑したwwwwwwwwwwwwwwww
wwwwwwwwwwwwwwwwwwwwwwww
wwwwwwwwwww
0708nobodyさん
2006/04/15(土) 22:53:42ID:???0709nobodyさん
2006/04/15(土) 23:14:40ID:???0710nobodyさん
2006/04/15(土) 23:30:23ID:oGexcrlzサーバーにアクセスすると、サーバーがデータをよこさない様子で
下のスクリプトの最後の行の手前までは問題なく動くのですが、最後の行で止まります。
どうやらwww3.pref.yamanashi.jpのサーバー全てで同じく止まるようです。
このスクリプトでwww.pref.yamanashi.jpはじめ他のサーバーなら問題なくデータが取得できているので
スクリプトの基本はできているはずなんですが何が問題なんでしょうか?どうぞよろしくお願いします。
print SOCK "GET @_[1] HTTP/1.1\n";
print SOCK "Host: @_[0]\n";
print SOCKET "Connection: close\n\n";
print SOCK "User-Agent: @_[2]\r\n";
print SOCK "\r\n";
@SOCK = <SOCK>;
0711nobodyさん
2006/04/15(土) 23:36:47ID:???use LWP::Simple;
して
$data = get 'http://www3.pref.yamanashi.jp/uryo/i/C06.html';
でもしとけ
0712nobodyさん
2006/04/15(土) 23:53:56ID:???スライシングになってるのとか\r\nと\nの混在とか一つだけSOCKETとか…
配列の要素一つを表すには$_[0]…というか名前付けろよ
まあLWP使って置いた方が確実
0713nobodyさん
2006/04/16(日) 01:09:21ID:???perl -MLWP::Simple -e "print get 'http://www3.pref.yamanashi.jp/uryo/i/C06.html';"
してみると、確かに何も出ない。
どういうことだ?
0714nobodyさん
2006/04/16(日) 01:16:23ID:???0715nobodyさん
2006/04/16(日) 01:18:01ID:???0716nobodyさん
2006/04/16(日) 01:23:03ID:???今試したら出てきたよ
0717713
2006/04/16(日) 01:41:35ID:???おそらく710も同じ原因だと思われ。
でも、スクリプトが酷すぎるので、LWPを使うのをお勧めする。
0718710
2006/04/16(日) 03:09:37ID:???細かい文法もわからずコピペで作ったので
これを機に直してみます。
とりあえずLWPというのをやってみます。
0719nobodyさん
2006/04/16(日) 05:48:11ID:???どうしても実現したいという気持ちはわかるが。
0720nobodyさん
2006/04/16(日) 10:26:11ID:???ABC[CR][LF]
ABC[CR][LF]
ABC[CR][LF]
([CR]は\x0Dで[LF]は\x0Aです)
こんなファイルを
open(DAT,"TEST.txt");
binmode(DAT);
print while( <DAT> );
close(DAT);
として読み出すと、なぜか
ABC[CR][CR][LF]
とCRが増えるんですが何故でしょうか?
[LF]を[CR][LF]に変換しちゃってるようなんですが、binmodeにしても変換が行われるのですか?
0721nobodyさん
2006/04/16(日) 11:04:54ID:???Perlは入力と出力、両方で改行コードをいじる機能がONになっている。
どういう用途か知らんが、(binmodeしてない)テキストモードなら入力のCRLFをちゃんと\nとして認識してくれるぞ?
0722nobodyさん
2006/04/16(日) 11:21:18ID:???CGIのヘッダとして常に出力する定型文があるのですが、それはLFで保存されています。
ついでにHTTPレスポンスも外のファイルにしたいと思いまして。
そこで、HTTPの応答はCRLFだったので、外部ファイルにCRLFで保存して試したところ
上のような状態になりまして…。
よく見れば定型文の方もLFが全てCRLFになっていたのですが、こっちは気がつきませんでした。
どうもありがとうございました。
0723nobodyさん
2006/04/16(日) 11:49:38ID:???0724nobodyさん
2006/04/17(月) 20:57:23ID:???変数名の内容の変数を作る
ってのを見たんだけど、これを関数で出来ないんですか?
たとえば
my($funcname) = 'calc';
ってしたあとに
&{$funcname}
ってやると
sub calc
が呼ばれるみたいな感じ
何がやりたいのかっていうと、自分で書いてるスクリプトに plugin で機能追加できるように
したいんですけど、イマイチやりかたが思い浮かばないので上記の方法が出来れば簡単かなって・・・
0725nobodyさん
2006/04/17(月) 21:03:38ID:???my($funcname) = \&{'test'};
で関数名を入れて、
&$funcname;
で呼び出せました
plugin を実現するには require とか use しないといけないかなぁ・・・とか思ってたけど、
これでなんとかperlでもっともっと遊べそうです
0726nobodyさん
2006/04/17(月) 21:05:31ID:???何書いてんだか orz
package でスクリプト書ける人はこんな回りくどいやり方とかはしないのかしらん?
plugin とか実装したことのある人の意見とかアドバイスがあったらよろしこです m(_ _)m
0727質問
2006/04/17(月) 21:09:36ID:fgM7OcPI正規表現にて
&str1 = "ZZZZ"
&str2 = "YYYY"
$bufの値の中で
value="xxxZZZZxx"
を見つけたら
value="YYYYxxxZZZZxx"
に一括変換したい。
(xは任意の文字列、英数字および.~-/?&+=:@%;#%)
いろいろ試しましたが
$bufから"value="が消滅したりしてだめでした。
だれか力を貸してください。
0728727
2006/04/17(月) 21:25:52ID:fgM7OcPI正規表現でもなくともいいのですが・・・
0729nobodyさん
2006/04/17(月) 21:27:37ID:???「require」「package」「シンボルテーブル」あたりの知識が足りないの分かってんなら調べりゃいいじゃん。
そもそもplug-inで追加される機能が誰に対してのものなのか。
>>727
$bufの文字列内に$str1が存在すれば$bufの7文字目と8文字目の間に$str2を挿入するってこと?
substrを左辺値にして使うといい。
どうしても置換でしたければ s/^(value=")(.*$str1.*")$/$1$str2$2/;
0731727
2006/04/17(月) 22:08:29ID:fgM7OcPI>>730
$str1,$str2でした。
0732727
2006/04/17(月) 22:33:27ID:fgM7OcPI>>729
>$bufの文字列内に$str1が存在すれば$bufの7文字目と8文字目の間に$str2を挿入するってこと?
という意味ではなく、
$bufの文字列内の任意位置に「value="xxxZZZZxx"」(xは0文字以上の英数字(.~-/?&+=:@%;#%))
という文字列部分を
「value="YYYYxxxZZZZxx"」に変換したかった。
ありがとうございます。
$buf =~ s/(value\=\")([\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]*$str1[\w\.\~\-\/\?\&\+\=\:\@\%\;\#\%]*\")/$1$str2$2/g;
にて動作いたしました。(テストパターンが万全ではないですが・・・)
何か間違いなどがございましたら、ご指摘ください。
0733nobodyさん
2006/04/17(月) 22:43:52ID:???opendirでpluginディレクトリ開いて順に名前を取得したらrequireなりuseなりすりゃいんじゃないの?
てか明らかにuse strict;したこと無いやつにそこまで無理するなと言いたい
0734nobodyさん
2006/04/17(月) 23:01:48ID:???sub load_plugin {
my($self, $config) = @_;
my $module = delete $config->{module};
$module =~ s/^Plagger::Plugin:://;
$module = "Plagger::Plugin::$module";
if (my $path = $self->plugins_path->{$module}) {
eval { require $path } or die $@;
} else {
$module->require or die $@;
}
$self->log(info => "plugin $module loaded.");
my $plugin = $module->new($config);
$plugin->cache( Plagger::CacheProxy->new($plugin, $self->cache) );
$plugin->register($self);
push @{$self->{plugins}}, $plugin;
}
0735nobodyさん
2006/04/17(月) 23:22:47ID:???0737nobodyさん
2006/04/17(月) 23:38:05ID:???0739nobodyさん
2006/04/18(火) 00:49:34ID:???http://ex14.2ch.net/test/read.cgi/news4vip/1145258206/
0740nobodyさん
2006/04/18(火) 00:52:31ID:???require した際に各プラグインが最初に実行する関数をたとえば pluginmain としたとして、
そうすると複数のプラグインで関数名がだぶることになって -W 付で実行してるとエラー吐かれるんですよ
だから各プラグインで実行される関数名をプラグインから指定すりゃまぁなんとかなるかなって思った次第です
>734
その関数に渡される値が何なのかわからないからどうとも言えないかなぁ
とりあえず真面目にパッケージとか学んでみようかと思う
0742nobodyさん
2006/04/18(火) 02:36:43ID:???#!/usr/bin/perl -W
use strict;
{ package Foo; sub new { bless { foo => 'foo' } } sub var { $_[0]->{'foo'} } }
{ package Bar; sub new { bless { bar => 'bar' } } sub var { $_[0]->{'bar'} } }
{ package Baz; sub new { bless { baz => 'baz' } } sub var { $_[0]->{'baz'} } }
print join ',', Foo->new->var, Bar->new->var, Baz->new->var;
__END__
http://www.kt.rim.or.jp/~kbk/perl5.005/perlmod.html
http://www.kt.rim.or.jp/~kbk/perl5.005/perlobj.html
http://www.kt.rim.or.jp/~kbk/perl5.005/perlbot.html
http://perl.infoware.ne.jp/documents/perlboot.ja.html
http://search.cpan.org/~miyagawa/Plagger-0.6.3/
0743nobodyさん
2006/04/18(火) 10:30:14ID:???パッケージなんて簡単だろ。
package Plugin::Foo
sub baa{
}
....
て書いてrequire Plugin::Foo;
名前空間を無かったことにしたいなら呼び出し先でuse Exporter;しろ
0744nobodyさん
2006/04/18(火) 13:20:05ID:???掲示板等でタグを使用不可にしたいのですが、
&は変換するけど、&はそのままで除外するという場合
どのようにすればよいでしょうか?
$str =~ s/&[^(amp;)]/&/g;
このようにしたのですがうまくいきません。
0745744
2006/04/18(火) 13:23:54ID:???訂正します。全角にしました。
&は変換するけど、&amp;はそのままで除外するという場合です。
$str =~ s/&[^(amp;)]/&amp;/g;
うまくいきません。
0746nobodyさん
2006/04/18(火) 14:13:25ID:???0747nobodyさん
NGNGそれ自体を実現するには否定先読みを使えば良い
$str =~ s/&(?!amp;)/&/g;
が、もしかすると、やりたいことは置換の順序を変えればできたりしない?
$str =~ s/&/&/g;
$str =~ s/</</g;
$str =~ s/>/>/g;
$str =~ s/"/"/g;
0748744
2006/04/18(火) 14:45:53ID:pGVz01kP出来ませんでした。ありがとうございました。
>>747
おぉ!出来ました。ありがとうございました。
否定先読みというのは初めて知りました。
ちなみに「やりたいこと〜」でご指摘されてることは私の想定していたことではありませんが、
よく見るそのやり方の順序に意味があったとは知りませんでした。
なるほど、勉強になります。
0749nobodyさん
2006/04/19(水) 16:50:38ID:YxQG/IvKで、ある文字列数以上の長さ以上で
文字列($comment)に全角がなかったら スパムって判定をしたいと考えてます。
見よう見真似で
---------------------------------------------------------
if(length($comment) > 128){ #128文字以上の場合チェック
$spam_flg = 1;
if ($comment =~ /[\xA1-\xFE][\xA1-\xFE]/){ #全角が含まれてるから日本語
$spam_flg = 0;
}
if($spam_flg > 0){ #多分に外国のお方。
Error("スパムでした");
}
}
----------------------------------------------------------
でやったのですが
判定が成功せずに、全文半角でも $spam_flg= 0 になっちゃいます。
if ($comment =~ /[\x80-\xff]/) { でもだめでした。
文字コードはEUCです。
どなたか m(_ _"m)ペコリ
0750nobodyさん
2006/04/19(水) 17:41:23ID:???0751nobodyさん
2006/04/19(水) 17:52:53ID:???Jcodeを使うときに、
$str = jcode($str)->mime_encode;
で、メールのヘッダ部分を作れ、
$str = jcode($str)->mime_decode->sjis;
で元に戻りますよね?
で、同じことをEncodeモジュールでやろうとして
use Encode 'decode', 'encode';
my $str = 'ソース焼きそば十杯おいしいな☆';
my $header = encode('MIME-Header-ISO_2022_JP', $str);
だとエンコードされた文字列がおかしく(Jcodeと比較して)、さらにデコードの方法がわかりません。
my $str =
'=?ISO-2022-JP?B?P1w/Wz9YPxskKEQ/PxsoQj8/Pz8bJChEPz8bKEJcP3Q/Pz8/Pz8/Pz8/?=
=?ISO-2022-JP?B?Pz9cPz8/GyQoRD8/GyhCPz8/Pz8/Pz8/Pz8/?=';
$str = decode('MIME-Header-ISO_2022_JP', $str);
だと、”MIME B unsupported..”
Encode::from_to($str,'MIME-Header-ISO_2022_JP','shiftjis');
でも同じ・・・
ソースはsjis書いています。
よろしくお願いします・・・。
0752nobodyさん
2006/04/19(水) 18:11:24ID:???0753749
2006/04/19(水) 20:40:17ID:tcTD8ojrでも、全角文字の判別がよくわかんないです
もうちょっと。。 m(_ _"m)ペコリ
0754nobodyさん
2006/04/20(木) 11:17:19ID:???# Shift_JISで保存
use Encode qw/encode decode/;
use Jcode;
my $str = 'ソース焼きそば十杯おいしいな☆';
# Jcode
my $header_jcode = jcode($str)->mime_encode;
print "$header_jcode\n";
print jcode($header_jcode)->mime_decode->sjis, "\n";
# Encode
my $header_encode = encode('MIME-HEADER-ISO_2022_JP', decode('Shift_JIS', $str));
print "$header_encode\n";
my $decoded = encode('Shift_JIS', decode('MIME-HEADER', $header_encode));
print "$decoded\n";
0756nobodyさん
2006/04/20(木) 17:58:44ID:???0758nobodyさん
2006/04/21(金) 16:34:52ID:c29HAKrqこの1文字が「漢字」か「漢字以外」かを判別する方法を教えて下さい。
文字コードはEUC使ってますが、UTF-8でも良いです。
よろしくお願い致します。
0759nobodyさん
2006/04/21(金) 16:39:19ID:???JperlかPerl5.8以降を使ってねん
0760nobodyさん
2006/04/21(金) 16:40:03ID:???0763nobodyさん
2006/04/21(金) 17:20:11ID:c29HAKrqありがとうございます。やってみたのですが、上手く動きません。
ひらがなにもカタカナにもマッチしてしまいます。
試しに
/あ/
だと、ちゃんと「あ」にマッチするのですが、
/[あ]/
だと、「あ」以外の全ての文字にマッチしてしまいます。
どうも日本語で文字クラスが使えないっぽい…。
Perlのバージョンは5.8.5、EUC環境です。
何か初歩的なまちがいをしてるような気もしますが、
もしありがちなミスなどあれば教えて下さい。
よろしくお願い致します。
0764763
2006/04/21(金) 17:51:19ID:???全て解決しました。
みなさん、ありがとうございました。
0765nobodyさん
2006/04/21(金) 23:19:35ID:???ABCは数が変動する為指定する事ができずお手上げで…。
0766nobodyさん
2006/04/21(金) 23:20:59ID:???0767nobodyさん
2006/04/21(金) 23:32:11ID:???0769nobodyさん
2006/04/22(土) 00:27:08ID:???0770nobodyさん
2006/04/22(土) 00:40:06ID:???ファイル数が変動するってことか?
readdirでファイル一覧取得してchmodじゃだめなのか?
いいたいことを勘違いしてたらすまそ
0771nobodyさん
2006/04/22(土) 04:40:48ID:???use File::chmod;
chmod(0666, <*>);
とか?
0772nobodyさん
2006/04/22(土) 08:49:21ID:???ファイル名を変えるのに、単純に、
rename "AB1234.txt","AB0000.txt";
は上手くできるのですが、
ディレクトリ内のファイルの探してから名前を変えようと
したら上手くいきません。何がダメなんでしょうか?
use File::Find;
$dir="./";
find(sub { push @files, $File::Find::name if -f }, $dir);
foreach(@files){
if(substr($_,2,2) eq "AB"){
$file1=$_;
}
}
$file2="AB0000.txt";
rename "$file1","$file2";
よろしくお願いします。
0773nobodyさん
2006/04/22(土) 11:03:29ID:???この条件に当てはまらなかった時、$file1はどうなる?
0774nobodyさん
2006/04/22(土) 11:12:22ID:???print substr("AB1234.txt", 2, 2);
を見てみる所から始めないと。デバッグの基本だよ。
Perl以外の言語経験があるかどうかは分からないけど、このレベルだと
何かプログラムと呼べる物を完成させるのは難しいと思う。
0775nobodyさん
2006/04/22(土) 11:33:07ID:???ただしこれでも、/^..12(.*)/のファイルが全部条件に当てはまるので
どっちにしてもダメ。
やりたい事をぼかすのではなく、もっと正確に書かないと…。
カレントを見るならFile::Findなんか使う必要もないし、全体的に意味不明。
0776751
2006/04/22(土) 12:35:38ID:???SJISやEUCでソース書く限り、その処理が全部について回るのか・・・
ありがとう。
>>772
単純にforeach(@files)の中で
if($_ =~ /^AB/){
・・・
}
でだめなん?
$_ =~ /^AB\d{4}/
$_ =~ /^AB\d{4}.txt$/
とか、大文字小文字区別したくなかったら最後に/iとか。
意味が違う?
0777772
2006/04/22(土) 19:08:13ID:???if(substr($_,2,2) eq "AB"){ の件なんですけど、
@filesで格納されているのは、 "./AB1234.txt" となるので、
"./"を外すためにやってます。
カレントディレクトリの中に入っている ABで始まるファイルを
見つけて、それのファイル名を変更したいのです。
0778nobodyさん
2006/04/22(土) 19:18:24ID:???じゃあこれでどうよ。
@files = grep /^AB/, glob "*";
rename shift @files, "AB0000.txt";
0779772
2006/04/22(土) 19:35:58ID:???じっくり考えたらこういうやり方がある事がわかりました。
@files=glob("AB*.txt");
$file1=$files[0];
$file2="AB9999.html";
$res = rename "$file1","$file2";
まだまだ勉強不足を痛感しました。(汗)
foreach my $source_file (grep /^AB/, readdir $dir_handle) {
$source_file or die "file not found.:$!";
rename $source_file, $dist_filename
? last
: die "Can not rename file.:$!"
}
closedir $dir_handle;
こんな感じかしら。。。
と思ったら、、、
>>781
そうですか。スマソ。
0783nobodyさん
2006/04/23(日) 00:45:55ID:???>782
くじけずにこれからもよろしこですm(_ _)m
■ このスレッドは過去ログ倉庫に格納されています