"The duct tape of the Internet" こと、Perl についての質問箱です。
"There's more than one way to do it" ということで、
Perl の奥深さについて皆で語り合い、追求してまいりましょう。
CGI についての質問は板違いです。WEB プログラミング板でどうぞ。
CGI と Perlの区別がつかない人も WEB プログラミング板に行ってください。
(WEB プログラミング板:
http://pc11.2ch.net/php/)
CGI の質問は答えが Perl と全然関係ない話に帰着する場合が
多かったりするので WEB プログラミング板に行って聞いたほうが得ですよ。
このスレでは(CGI 以外の)純粋にPerlのみに関係する質問を取り扱っていこうと思います。
スレ違いの質問にはスルーか、速やかな誘導をお願いします。
http://www.perl.org/get.html ● 2009/11/02 現在の最新版: 5.10.1
▼ 前スレ
Perlについての質問箱 41箱目
http://pc12.2ch.net/test/read.cgi/tech/1249581780/ リンク集は
>>2-3 Perl 日本語処理の基礎の基礎
>>4 過去スレは
>>5-6 あたり
# [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 でエンコードする必要があります。
今からPerlをするのって無駄ですかね?
やっぱり、Perl 6が出てからしたほうが無難ですか?
11 :
デフォルトの名無しさん:2009/11/05(木) 13:49:58
>>10 > 今からPerlをするのって無駄ですかね?
いや、別に。
> やっぱり、Perl 6が出てからしたほうが無難ですか?
キニスンな
Perl5とPerl6はもはや別言語。
同じ名前がついてるのが不思議なレベル
13 :
デフォルトの名無しさん:2009/11/05(木) 23:37:34
こまる!
おまる!
Perlのデストラクタって
強制終了時にも呼ばれますか?
そんな器用なモンじゃない。
substrのsubって何の略ですか?
wikipedia より引用
「さぶ」は、日本で薔薇族に続き出版された男性同性愛者向け雑誌(ゲイ雑誌)である。
SMを中心とした雑誌アブハンター増刊号として、サン出版より1974年11月に創刊。
当初3号まで隔月発行であったが、1975年6月号(4号)より月刊化された。
創刊編集長は、有名なサブカル編集者である櫻木徹郎。
>>16 だれに何かの略だというデタラメ吹き込まれたんだ?
>>16 だれにsubとstrを分けるというデタラメ吹き込まれたんだ?
Perl 6ってPerl 5互換モード搭載してるらしいんだけど
4と5もだいぶ違ったしな。そのうちなれるだろ。
4と5はそれなりに互換性があったけど
5と6は殆ど互換性が無いらしい。
だからPerl 6に5の互換モードの搭載を検討してるっぽい。
俺は試作品とか大量に作ってるから是非搭載して欲しいな・・・
また覚えるまで時間がかかりそうだし。
むしろ5に6互換モジュールが作られ始めてるから今のうちに慣れとくって手もあるんだぜ
以下のようにファイルハンドルをハッシュで持って、それを<>演算子の中で使うとエラーになります。
<>演算子と同等で、ハッシュも使える関数はありますでしょうか?
my $in = $fh->{handle}; <$in>; と一旦、変数に格納してから使うしかないでしょうか?
my $fh = create_fh( 'data.txt' );
while ( my $line = < $fh->{handle} > ) {
・・・
・・・
}
close $fh->{handle};
sub create_fh {
my $file = shift;
open my $fh, '<', $file or die $!;
return { file => $file, handle => $fh };
}
置換の際、被置換文字列($string)に、ある文字列($buf)を格納した変数で置換するとき、その変数に^などの特殊文字が入っていると
うまく置換されないのですがどのようにすればよいのでしょうか
$string =~ s/$buf//;
quotemeta($buf)
また(カッコ)を付けてやがる。
何でもかんでもカッコ付けまくるカッコ病か、おまいは。
こういうヤツってさ、ファイルをコピーするだけでも
C:> copy (hoge.txt hoge.bak)
みたいにカッコつけるんかな。
perlの前はlisp使いだったので勘弁してください
perlじゃなくてPerlね
これじゃダメ?
$string =~ s/\Q$buf//;
やってみればいいじゃん
39 :
デフォルトの名無しさん:2009/11/11(水) 22:02:48
aaabdddbbbeeeecddddd
という文字列が有ったとして
文字列に現れる最後のbから一番近いcまでの文字を抜き出すにはどのような正規表現が良いのでしょうか
cに一番近いbという感じで考えたのですが、c以降にbがあるのならばともかく、c以前にbが有り、それがcにとっての最短マッチである場合の表現がわかりません
/(b[^b]*?c)/
41 :
デフォルトの名無しさん:2009/11/11(水) 22:48:04
>>40 こんな簡単な記述で出来るのか……
精進します
/(b[^b]*?c)[^b]*?$/;
こっちの方が安全じゃないだろうか。
上の例だと、baaacbeeecみたいなのは$1がbaaacになっちゃうし。
よく考えたら
baaacbeeecaabみたいなのに対応してないことに気がついた
で書き直したのがこれだが、
/(b[^b]*?c)(?:[^b]*|[^b]*b[^c]*)$/
さらに考えたら、これで良いことに気づいた。
/.*(b[^b]*?c)/
my @string = qw{aa,33 bb,44 cc,55 aa,xx bb,44 cc,55 aa,yy bb,44 cc,55};
という配列の各要素をカンマ区切りでハッシュkeyとvalueに分け、かつ特定のkeyでぐぎった2次元配列にしたいです。
具体的には上記の配列を
$list[0]{aa} = 33;
$list[0]{bb} = 44;
$list[0]{cc} = 55;
$list[1]{aa} = xx;
$list[1]{bb} = bb;
$list[1]{cc} = 44;
$list[2]{aa} = yy;
$list[2]{bb} = 44;
$list[2]{cc} = 55;
というような2次元配列にしたいので以下のように書いたのですが、
最後のprintでは何も表示されませんでした。何がいけなかったのでしょうか?
my @list;
my %data;
my @string = qw{aa,33 bb,44 cc,55 aa,xx bb,44 cc,55 aa,yy bb,44 cc,55};
my $n = 0;
foreach my $item (@string) {
my ($key, $value) = split qq{,}, $item;
$data{$key} = $value;
if($key eq qq{cc}) {
$list[$n] = %data; %data=(); $n++;
}
}
print $list[0]{aa};
$list[$n] = \%data;
ハッシュを代入すれば動くはず
以下のように、コピーしてから代入じゃないかな?
$list[$n] = { %data };
素直にやれば
$list[$n]{$key} = $value;
$n++ if($key eq qq{cc});
>>44 $list[$n] = {%data}; %data=(); $n++;
どうちがうかは自分で考えてね
49 :
44:2009/11/13(金) 10:15:26
>>47 素直にやることにしました。ありがとうございました。
>>48 deep copy と shallow copyの違いですかね?
映らない理由はわかりました。
デバッグという概念を最初から持っていない
Rubyだとそのオブジェクトがどのようなメソッドを持っているかを、
p obj.methods
でわかりますが、Perlだとどのようにするのでしょうか?
my $obj = new Foo;
print $obj->methods???
>>52 d
CPANからインストールするんすね。
Coroでサイト情報を取りに行けないのですが、何故でしょうか?
use LWP::Simple;
use Coro;
my $url = '
http://www.yahoo.co.jp/';
my $res;
async {
$res = get $url;
};
print $res; # 何も表示されない
取りに行ってと指示しただけで、取りに行ったか確認もしていないから。
すみません、環境を書くのを忘れてました。
Windows XP SP2、ActivePerl 5.8.9です。
あと、
>>54で、print $res;の前に、cede;も書いてましたが抜け落ちてました。
普通に、$res = "foo";とかだと表示されるんですけどね。。。
Coro::LWPを使え
60 :
デフォルトの名無しさん:2009/11/16(月) 14:27:03
初心者の質問なのですが、よろしくお願いします。
以下のコードを実行すると、"koko"と表示された後、しばらく時間が経ってから
終了します。GCが走っているんじゃないかと思うのですが、こんな箇所でも走るのでしょうか?
use strict;
use warnings;
my @rray;
my $i = 0;
while ($i < 100000000) {
push(@rray, $i);
$i++;
}
$i = 0;
while ($i < 1) {
unshift(@rray, 1);
pop(@rray);
print "koko\n";
$i++;
}
GC(笑)
62 :
デフォルトの名無しさん:2009/11/16(月) 14:40:30
メモリを食うみたいだから、シェルがスワップアウトされてるんじゃないの?
GC? Game Cube?
まあ何でも良いんだけど、このコードをみると、
下のwhileは一回で抜けるように見えるのは俺だけか
>>65 おそらくデバッグ用にそうしてるんだろ。
それくらい善意に解釈してやれよ。
本質とは関係ないとこをいちいちツッコミ入れる
おまいのようなヤツが一番ウザイんだよ。
お前が言うな
どうせマルチなんだから文句を言ってもいいんじゃない?
パターンマッチとindex関数
文字列に文字が含まれているか確認するならどっちがいい?
論より証拠ってことでベンチとってみた。
use Benchmark;
my $s = '';
for (1.10000) {
$s .= chr(32 + rand(95));
}
timethese(
undef,
{
re => sub { $s =~ /abcdefgh/ },
index => sub { index($s, 'abcdefgh') },
}
);
結果は
Benchmark: running index, re for at least 3 CPU seconds...
index: 4 wallclock secs ( 3.24 usr + 0.00 sys = 3.24 CPU) @ 7719383.64/s (n=25010803)
re: 4 wallclock secs ( 3.09 usr + 0.00 sys = 3.09 CPU) @ 10203485.11/s (n=31528769)
正規表現すげー。
perlのバージョンは
This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi
です。測定方法に文句ある人はいろいろ試してくれ。
無粋な突っ込みだが、
>for (1.10000) {
for (1..10000) {
だよね?
>>76 うお、その通りだ。やりなおしたぜ。
Benchmark: running index, re for at least 3 CPU seconds...
index: 4 wallclock secs ( 3.12 usr + 0.00 sys = 3.12 CPU) @ 131580.13/s (n=410530)
re: 3 wallclock secs ( 3.13 usr + 0.00 sys = 3.13 CPU) @ 131156.87/s (n=410521)
indexの方がやや速いが差は微妙という常識的な結果だった。
| / ハ__________.ノ |
ノ /_.イ / ノト、_」/ |/l/_.斗 \ 〕
. / l  ̄ 7|/| 」ィfて-カ` ィf リハ ! 「|
/ | ∧| ノ 弋zノ 辷ノ' ノ∨|/| おなかいっぱい食べさせられると(ry
. / | // | |、 , | | ノ
. / // | | \ 人 ハ |
/ 厶-、| ト._个 、 ∠フ _. イ| \|
/ / / ̄ ヽ、 >- ≦ノ| | /´⌒ く\
ということでもっと大きいデータや小さいデータを使うと若干差が出たような。
大きさに比例するものとコンスタントな速度を維持できるものと。
79 :
デフォルトの名無しさん:2009/11/19(木) 18:36:44
共用のレンタルサーバを利用してCGIの制作を行っているのですが、モジュールの扱い
についてわからないことがあるので、質問させてください。
レンタルサーバに標準で入っていないモジュールをcpanより、~/CPAN以下にインストー
ルしているのですが、自分で制作したCGIはcpanのモジュールを使用しているため@INC
にパスを追加しないといけません。
現在は全てのモジュールを使用するcgiに@INCに追加するコードを追加しているのですが、
何か設定でパスを追加することはできないでしょうか?
共用サーバの為、ホームディレクトリ以下での作業以外はできないと思います。
どうか、宜しくお願いいたします。
81 :
79:2009/11/19(木) 18:58:17
>>80 ありがとうございます。
ファイルはCGIなのですが、Perlの設定になるのかと思いこちらで質問をさせていただきました。
Webプログラミング板の方が適切なようですので、もうしばらく書き込みをお待ちした後にWebプログラミング板に移動させていただきます。
待たなくていいから今すぐ池
ほんとだよ。
コマンドラインでもCGIでも共通する部分の質問なんだから
CGIはWebProg板へのwarnを出した上で答えも付けてあげればいいのに。
猫おばさんの襲来である
知らないから答えられないだけだろ
本を一冊通読した方が良いよ。
「猿でも三日でわかるCGI入門」みたいなものにも必ず書いてあるようなことが
わかってないんだから。聞くのも答えるのも時間の無駄。
無駄だと思うなら答えなきゃいいじゃん。
>>80 とか
>>82 とか他人に不快感を与えるレスの方がよっぽど無駄。
>>83 use libにしろ@INCにしろいちいち全部に書くのが大変だから
まとめて設定したいって話なんじゃないの?
そうすると環境変数PERLLIBだけど、それを設定するにはCGIだと
鯖の設定ファイルとか.htaccessとかいう話になってきてこっち向き
ではないよ。WebProg板に行くべき。
>>88 いやそれ普通の誘導だから。そのくらいで不快感とか言われても
ポカーンだよ。
普通の誘導wwww
普通じゃない誘導……?
まぁ、普通なんて関係ないよ。
世のなかでPerlを使っている人がどれだけいることか・・・
本スレッドは、CGIに関する事項は取り扱っておりません。
>>1をよくお読みの上、WebProg板への移動をお願いいたします。
>>88 > 無駄だと思うなら答えなきゃいいじゃん。
>
>>80 とか
>>82 とか他人に不快感を与えるレスの方がよっぽど無駄。
他人に不快感を与えるのが悪いと思っているのなら、まず自分が
>>88のような他人に不快感を与えるレスすんな。
なんでこんなに荒れてんの?
まあ質問スレで荒れるのは大体が回答しないけど余計なこと言う奴が原因だけどねw
回答しないけど余計なこと言う奴よ
新でくれ
回答せずに余計なことをいう人が集結しているスレはここですか?
自分の知らないことを聞かれると逆切れする回答者がいるよね
いないよ
いないだろ。
さっき居たよ?
windowsでperlを使えるようにするためactiveperlをインストールしました。
拡張子を関連付けたのですがhello_world.plをクリックしたらhello,worldと一瞬表示されて消えます。
どうすればいいのでしょうか?
>>102 方法はいっぱいある。
例えばキーを押すまでループするプログラムを書く。
最後に<STDIN>;
>>106の下の、色々やってるけど
>DOSバッチのpauseとかに相当するものです。
`pause`でええやんとか思た
MVCフレームワークを勉強しているのですが、それで悩んでいます。
勉強用として制作したものが非常に動作の重いものになってしまいました。
どこが原因かの切り分けをおこなっていたところ、
各パッケージをuseしているところ(20箇所ぐらい)がかなり負担になっているみたいでした。
BEGIN{
push(@INC, "model");
push(@INC, "view");
push(@INC, "control");
use Model;
use View;
use Control;
.....
}
そこで↑のところを↓のように変更したらそこそこ改善された
(ログイン画面を表示するだけなのに4secかかっていたのが半分ぐらいに)
のですが、@INCにパスを追加するよりも絶対パス指定をした方がそんなにアドバンテージがあるものなんでしょうか?
use model::Model;
use view::Viewl;
use control::Control;
....
>>108 > のですが、@INCにパスを追加するよりも絶対パス指定をした方がそんなにアドバンテージがあるものなんでしょうか?
無い
なんだかみんなが少し優しくなった気がする
ぼくのおかげでみんなが少し優しくなったのなら、質問に答えなくても少しは役に
たてたということですね。
>>108 捜索範囲が広がればそれだけ時間もかかるんじゃないか?
証拠はないけど
というかそもそも名前空間が被ったりしないようにできるだけ@INCは少ない方がいいと思う
例えば lib/control/View.pm と lib/view/View.pm なんかがあった場合に、最初のだと競合して予想外の動作をするかもしれない
113 :
108:2009/11/21(土) 02:31:47
>>109 やっぱりほかの部分に原因があって、たまたま速くなっただけでしょうか
>>112 絶対パスで書くのは長くなってしまって面倒だなぁと思って@INCで済ませていました。
MVCのサンプル通りのディレクトリ構造でやると lib::framework::abstract::model::Model.pm となってしまって
なんだかなぁと。。。でもその方が安全みたいなのでそちらで進めてみたいと思います。
モジュールの名前は大文字で始めることになっている。
小文字で始まるのはプラグマ
/PATH/TO/LIB/ 以下に FOO/Bar.pm があるなら
=== Bar.pm ===
package Foo::Bar ;
略
1;
======
って package 宣言して呼び出す方で
use lib qw( /PATH/TO/LIB/ ) ;
use Foo::Bar ;
114氏の言う通りなので、 FOO のディレクトリ名も
お約束として大文字スタート。
s/FOO/Foo/g ;
orz...
PenDCでactive perlをぶん回すと、
片方のコアだけ使ってCPU使用率が50%になるんだけど、
なんとか100%にできんもんかな
実装し直さない限りもう一方のコアを使いまくるアプリを動かすしかないな。
こんなにシングルコアなアプリも珍しい
forkしても多分1個しか使わない
使ってないコアで他のいろんなことができるように設計しといたんじゃね?
>>107 これいいんじゃない?
たまにこの手の初心者質問が出るからテンプレに入れるとか。
いらね。Perl関係ないし
これからプログラムをやってみたいと思っています。
目標はブログみたいなシステムを作りたいんですが、パールでできますか?
できない場合、他にそういうのを作れる言語を教えてほしいです。
はい
128 :
デフォルトの名無しさん:2009/11/26(木) 15:25:22
今までPerlが好き使ってたけどPHPってよく見たら凄く良いね
最初見た時「汚ねぇwwwwこんなスクリプト書く奴って顔も心も汚いんだろうなww」
とか思ってすいませんでした。細かいことを気にしない人にとって至高の言語です。
全くです。Perlのことは忘れてPHPに引っ越しましょう。
>>128 ま、言語の問題じゃ無く、プログラムを作る人間次第ってことだね
お前が作るプログラムをみたら
「汚ねぇwwwwこんなスクリプト書く奴って顔も心も汚いんだろうなww」
と思ってしまうだろう、多分
PHP最高!
Perlみたいに後から実装しないと実行出来ない機能がデフォでかなり装備されてる!
配列が使いづらいのは痛いけど
そうかそうか
>>131 良かったね、おめでとう
スレタイを読める日本語力があるともっと良かったのに
perl = htmlを吐き出すためのプログラミング言語
これは確定事項です。
世の中のコンピュータはすべて
WEBアプリで動作しています。
これは確定事項です。
つまり、>136の意図する所は
>135は>136と同様にそんなことはありえない
ということでいいのかな
俺がイケメンでちんちんズル剥けでかちんぽで男のフェロモンで女がメロメローンであるのも確定事項である
あ、なんだ
周知の事実を述べてるだけか
まあまあ、みんな落ち着いてもっとPerl関連の真面目な話に戻そうよ。
けんかヨクナイ(・∀・)
142 :
デフォルトの名無しさん:2009/11/28(土) 19:59:40
PostgreSQLに接続するためにDBD::Pgを使ってますが、DBD::ODBCを試して見たところ、自分の環境では
ODBCの方が少しだけ性能が上でした。単純なSELECTを発行しただけなのですが、これはこんなものなんでしょうか?
ODBCの方が性能がいいとすると、DBD::Pgの存在理由はなんなんでしょうか?
それを知ってどうしようと?
コンビニならセブンイレブンがあるのにローソンの存在理由はなんなんなんでしょうか?
問題解決法が選べることは喜ばしいことでは無いのか。
perldoc を見ても、Text::Balanced の使い方がいまいち理解できません
できれば日本語で解説しているブログなどをご存知でしたら教えていただけないでしょうか
extract_tagged 関数のみ使えればよいのですが。。。
>>146 後出しですみませんが、それは見つけました。
ただ、それ以外の文献が見つからないです。
やりたいことは
$open_tag = qr/<([a-zA-Z0-9]+)\s+([^>])+\s*>/;
で定義された独自タグのバランスをとることなんですが、そのURLからでは正規表現を使った場合のクローズタグの定義の仕方が分かりませんでした。
また、タグの定義をベタで書いた場合にも思ったとおりに動いてくれない場合があるため、何が分からないか分からない状態です。
具体的には
use Text::Balanced qw/extract_tagged/;
my $data = '<huga>test1<hoge>test2</hoge><hoge>test3<hoge>test4</hoge></hoge></huga>';
my($extracted, $remainder) = extract_tagged($data, '<hoge>', '</hoge>');
print "ext: $extracted\n";
print "rem: $remainder\n";
というスクリプトを作ってテストしてみたのですが、出力結果は期待に反して
ext:
rem: <huga>test1<hoge>test2</hoge><hoge>test3<hoge>test4</hoge></hoge></huga>
となってしまいました。
my($extracted, $remainder) = extract_tagged($data, '<huga>', '</huga>');
とすると期待通りの結果になるので、余計にわけが分からないです。
何か根本的に勘違いをしているような気がします。。。
>147
クローズタグ指定省略か undef 渡せば良きに計らってくれそうだけどそれじゃあかんの?
デフォルトだと空白を無視して「文字列先頭」から取り出してくるので無視する部分(第4引数)を
指定すればいいと思われ。>146 でも指定してある。
>>148 ああなるほど
このモジュールは先頭のタグのみを取り出してくれるだけなんですね
うまくいきました、ありがとうございます
ある範囲の数値(1-9など)からランダムな4つの数字を被らないように取り出す(取り出した4つの数値で新しいリストを作る)
という処理をさせたい場合、
いくらでもやり方はあると思うんですが、
一番スマートな感じにするにはどういう風になるでしょうか?
(List::Util::shuffle(1..9))[0..3]
何かの問題なら自分の力でな
>>150 こんなんどうですか?
my @nums = 1..9;
my @picked_nums = map splice( @nums, rand @nums, 1 ), 1..4;
数の範囲が1から1億だったらどうする?
一つ質問させてください。
Perlにおいて、文字列中の非表示文字を、簡単に確認できる方法はないでしょうか?
たとえばある文字列について、改行コードが\r\nか、それとも\nなのかを知りたいとき
これを確認する方法は、Devel::PeekのDump関数しかないのでしょうか?
(RubyでいうString#inspectやString#dumpのようなものがあれば、便利なのですが)
>154
1要素取り出して
その度、被ってないかチェックすれば良いんじゃね?
>>155 Unicode 16進表記でパターンマッチをかければいい。
例えば、[\x{ff10}-\x{ff19}]+ とすると、これは、全角の [0-9]+と同じ意味
>>154 こんな感じでどうでしょうか?
my $min = 1;
my $max = 10**8;
my $num_to_pick = 4;
my @picked_nums;
for ( 1..$num_to_pick ) {
my $picked_num;
do {
$picked_num = $min + int rand( $max - $min + 1 );
} while ( grep { $_ == $picked_num } @picked_nums );
push @picked_nums, $picked_num;
}
print "@picked_nums";
ヒアドキュメントから再帰的に呼び出しを行う実験をしています
4 my $cnt;
5 sub hoge{
6 return "@{[ ' [[' . hoge() . ']] ']}" if $cnt++ < 10;
7 return "hoge";
8 }
9
10
11 $huga = "[[@{[hoge()]}]]";
12 print "count : $cnt\n";
13 print $huga;
このような再帰呼び出しを行う場合だと、当たり前ですが
count : 11
[[ [[ [[ [[ [[ [[ [[ [[ [[ [[ [[hoge]] ]] ]] ]] ]] ]] ]] ]] ]] ]] ]]
という結果が帰ってきます(この場合についての動きは理解しました)
呼び出すタイミングを遅らせようと
11 $huga = '[[@{[hoge()]}]]';
13 print eval{ $huga };
としたところ、
count :
[[@{[hoge()]}]]
という結果になりました
B::Deparse で確認すると、シングルクォーテーションで囲った文字列の中の @ がエスケープされていました
なので、文字列として展開しても @ がそのままだったようです
質問したいことは、eval の使用制限は1回で、なんとかこの仕様を回避する方法はないかということです
よろしくお願いします
>>159 eval BLOCK と eval EXPR の違いについて調べてみればいいんじゃない
>>160 有難うございます
助言より色々試してみた結果、
11 $huga = '"[[@{[hoge()]}]]"';
13 print eval($huga);
とするとうまく行くことが判明しました
そんなこと聞いてません
163 :
155:2009/12/02(水) 21:24:56
>>157 申し訳ないのですが、やりたいのは非表示文字の簡単な確認(表示)なのです。
表示文字は\p{L}だから、非表示文字は[^\p{L}]
あとは任せた
perlの組み込み関数としてそんなものはないので
モジュール拾ってきてインストールするか1,2行の
プログラム書くかになるだろ。Devel::Peekでできる
んならそれでええやん。
166 :
150:2009/12/03(木) 15:51:53
規制巻き込まれてお礼遅れましたスイマセン
>>151-154 ありがとうございます。なるほどなるほど
シャッフルは目からウロコでした
範囲が大きい場合は一つずつチェックするやり方の方が良さげですねきっと
初心者です。
$ARGV[1]が巨大なファイルなので内容を配列に押し込むとやたらに時間がか
かるのとメモリが一杯一杯になるので、以下のようなコードになってしまいました。
whileループ内でファイルのopen/closeを繰り返す以外に、メモリに負担をかけない
解決策が無いでしょうか?
open(IN0,"<$ARGV[0]");
while(<IN0>){
処理;
open(IN1,"<$ARGV[1]");
while(<IN1>){
if(条件){処理;
last;
}
}
close(IN1);
}
close(IN2);
ねえよ、帰れ
169 :
155:2009/12/03(木) 20:55:20
>>165 ありがとうございます。あきらめてDevel::Peekを使うことにします
$^Nは、正規表現パターン内では
使えないの?
\数字のかわりに、/(.).+?$^N/とか
書けたら、括弧をいちいち数えなくても
よくなってウマー、と試したけど、なんか
うまくいかない。orz
>>167 どんな処理してるか/ファイルサイズにもよるけど、いちいちopenするのではなく、
seek(IN1, 0, 0)でファイルポインタを戻してみるとか。
早く処理できるようなデータの持ち方に変えた方がよいのでは。
open/closeをなくしてseekにかえても、メモリに抱えられないぐらい
でかいファイル$ARGV[1]を毎回頭から読んでたら負けだと思う。
インデックス的なものを用意して全部読まなくていいように工夫する
しかないんじゃないかなぁ。
>>167 ファイルシステム版KVSとか使え
速度を問わないならdbopenとかでもいいからさ。
ただこの2つはシーケンシャルな読み出しにめっぽう弱い。
ので固定長ファイルに変換してseekで読み出すのも手。
それか
>>172のようにファイルに直接インデックス張っちゃうか。
perldoc界隈がなんか騒がしいな。
>>172>>173 一度だけハッシュを作ってそれを利用するという方法で高速化が出来ました。
>>173がインデックス的なと言ってくれたので思いつきました。
感謝です。
perlはメモリ喰いと批判されるけど64ビット版なら好きなだけメモリ喰っても良いんじゃないの?
実際のところどうなんだろ?
64bit版のperlあるの?
64bit linuxにデフォで入っていない?
そんなの5.8.0からとっくに対応になっとるやろボケ
知るかクズが
やかましわボケ
死ねカス
さっさとdual coreに対応しる
>>174 むしろKVSやdbopenがハッシュ関数を積極的に利用する方なんだがな。
ハッシュって言葉の意味と、DB系の話で何でハッシュって言葉がでてくるのか
ちゃんと勉強しとかないと恥かくぞ。
ハッシュテーブルを略してハッシュって言ってるんだろ。
ハードディスクを略してハードと言うのと同じ。
>>ハードディスクを略してハードと言うのと同じ
それはねーよ
ハードはハードウェアの略だろ、普通は
ハードディスクをハードと略するのはあり得ないな。
他の板ならそれでも許されるかもしれんが、少なくともプログラム板では無理。
189 :
デフォルトの名無しさん:2009/12/06(日) 22:06:17
つまらん
Perlのハッシュは連想配列と呼ぶべきなんだが
「%」→パーシュ(?)ってことでハッシュにしてるんだろう
4の頃は実際「連想配列」だったべ
5になったときにassociative arrayとかじゃなげーから呼び名を
hashにしたんじゃなかったか
単に内部実装がhash tableだからhashのはず
「連想」という誤訳が好きだったのに
お前らハッシュという言葉が何で、なんでハッシュテーブルって呼ぶのか
全然わかってないだろ・・・。
日本語でおk
>>193 キーをもとに生成されたハッシュ値を添え字とした配列だからでしょ。
知ったかはどうでもいい
ハッシュの実装って、コリジョンが起きたらどういう処理してるのん?
顔を真っ赤にして倒れるよ
>>198 ハッシュ値が同じになる奴はずるずるチェーンでつなげてたと思った。
複数のファイルをそれぞれ1行ずつ読み込みたいです
$lineを2つ使うわけにもいかなくて、どうしたらいいですか?
$lineを2つ使わないようにすればいいのではないでしょうか。
@lineでも使ったら
$lineをリファレンスで
コリジョンは起きて当然というか
要は確率的に均等に読みだしたいというのがハッシュのそもそもの目的
数字添え字にハッシュ作ったほうが普通に配列作るより早いんか?
Perlの内部構造について知りたいんですが、どのドキュメントから手をつけたら分かりやすいでしょうか
ソースコード嫁
PerlでOSを作ろうとしている変態のブログを読んでみたr・・・いや読まないほうがいいな
>>201 そもそも、それぞれ1行ずつ読み込む必要があるのか?
一度に読み込めばいいんじゃないの?
>>206 用途による
>>201 こんな感じでどうでしょうか
#! /usr/bin/perl
use strict;
open FH1, $ARGV[0];
open FH2, $ARGV[1];
while(1){
my($line1, $line2);
$line1 = <FH1>;
$line2 = <FH2>;
last if !defined $line1 and !defined $line2;
print "file 1 : $line1";
print "file 2 : $line2";
}
>>208 付属ドキュメントに内部構造関係のもたくさんあるので片っ端から読め。
最初はXSでデータの内部表現に慣れるとこから始めるのがいいかな。
>>206 実際perlのおじいさんみたいな言語であるawkには連想配列しかないな。
JavaScriptも連想配列しかなったよね、確か
>>215 おじいさんじゃありません。おかあさんです。
>>206 その可能性は高い。
リストはランダムアクセスできないから、
添え字の速度はあんまりだったはず。
かわりに、リスト代入とかforeachとかの
処理方法が充実してるってことのはず。
sed と sh がおじいさんとおばあさん
ed がひいじいさん
vi がおじさん
php がいとこ
Rubyは長男?
むしろRubyがいとこでPHPがゆとり教育で育った長男って感じじゃないかな
同じサイズで、ランダムアクセス用途ならハッシュ配列の方が高速に動作することが多いよ
Rubyって庶子だろ
いらない子
>>214 なるほど
XSに挫折したので内部の知識が知りたかったのですが順序が逆だったようですね
もうちょっとねばります
grepはペットですか?
awkの連想配列はSNOBO4Lからパクったもんだが
テキスト処理に威力絶大で、LL言語が続出するきっかけになった。
SNOBOLの作者はIcon言語も作ったが、
これもパターンマッチングとかジェネレータとか最近のLL言語の流行を先取りしている
>>208 マジレスするとperlgutsだろうな。
>>224 さっきの者だが、
XSに挫折するようだと内部構造はきついだろうから、
まずXS書けるようになるのが先決だな。
あとCリテラシー必須な。構造体理解してないと全く訳わからんぞ。
229 :
デフォルトの名無しさん:2009/12/11(金) 07:22:08
my %a;
$a{b} = {c=>1};
とした時に$a{b}のキーの一覧を取得するには、どうしたらいい?
my $d = $a{b};
keys(%$d);
でいけることを確認したが、一行では無理?
いろいろ()つけて試したが、全部syntax errorになった。
>>229 中カッコでいけるんじゃないかな?
keys %{ $a{b} }
とある変数の文字列、例えば $a="わたしは$1の$2が好き"; のように特殊変数とかが文字として入っているものに
マッチした結果を参照させる場合はどうすればよいでしょうか?
一応ここまでは考えたのですが
$a="わたしは$1の$2が好き";
my %machted_Reg_Hash = map +( $_, eval "$_"), $a=~ m|(\$[1-9とか])|g;
で、
printf qq|"%s" =>"%s"|, $_, $machted_Reg_Hash{"$_"} for keys %matched_Reg_Hash;
したら、
php=>RegExp
perl=>うんこー
長門=>--○◎●
それは未承諾さんのコードだろ、串野郎
うせえぞ和菓子野郎
呼ばれてない気がします。
Perlプログラムのテストを書きたいのだけれど、
今はTest::ClassとTest::Baseが主流ですか?
書き方はTest::Classが好みなんだけど、皆さんはどちらを使われてます?
また、fixtureの仕組みというか、テストデータの読み込み消し込みが解りません。
Test::Fixture::DBIC::Schema を使うのが一般的?
テストって?
そんなの使ったことない
知らないならレスしないでください。
ここは匿名掲示板です。
あなたを名指しで質問しているのではありません。
自意識過剰もいいとこです。
「一般的」とか言うからw
「特殊な質問ですが」とか言ってくれれば無視したのに
ところで
>>236の発言のどこが「自意識過剰」なの?
バカなの?いつ死ぬの?W
そんなの使ったことない <------ ここが自意識過剰100%
━┓
┏┛ ⌒
・ .___ ⌒ ___ ━┓
/ ―\ / ― \ ┏┛
/ノ (● X (●) \ヽ ・.
| (●) /_ (⌒ (●) /.
| (__/  ̄ヽ__) /
\ /´ ___/
\| \
/|´ |
これだからp2は
243 :
235:2009/12/13(日) 22:52:43
>>237も
>>239も私ではないのですが、
特殊な質問だったのですか・・・。
Perlではテストしないのが普通?
>>243 そういう訳でもないですよ。
私はTest::Moreを使っております。
このスレには脊椎反射馬鹿がいるからね
246 :
235:2009/12/13(日) 23:15:06
>>244 回答ありがとうございます。
Test::Moreが基本で、+αの機能を使いたい人が
BaseやClassを使うようですね。
DBICを使って組むことを考えてまして、pl部分にはあまりコードを
書きたくないので、各schemaファイルにコードを書いていこうと思ってます。
その時にある程度纏まった塊でテストしたいため、
Test::Moreではちょっと見辛いなと思ったため、Test::Classを選択しました。
>>245 そ、そうなんですか・・・。
a=100
b=200
c=300
という内容のファイルが合って、これを
a=100&b=200&c=300
に変換してくれるワンライナーはどうかけばいいですか。
1行ずつ読み込んで配列に格納し、さいごにjoin '&' すればいいんだと思うんですけど、さくっとかけるワンライナーがわかりません。
みなさんの黒魔術をおしえてください。
アレイコンテキストで読めよ
俺がやるならこれ。
% cat hoge
a=100
b=200
c=300
% perl -pe 's/\n/\&/ unless eof' hoge
a=100&b=200&c=300
アレイコンテキストで読んでjoinする方法だとだとchomp
しないと改行がのこるからさくっといかなかった。なんか
良い技ある?
% perl -e '@x=<>; chomp(@x); print join("&",@x)' hoge
a=100&b=200&c=300
>>247 黒くないとだめなのか
perl -e '$"="&",$_="@{[<>]}",s/\s//g,print' file
黒い所か真っ白なんだけど、(多分)一番短かいのがコレ
perl -0ple 's/\n(?=.)/&/g' file
Array で join に拘るなら、こう言う方法も。
perl -F"\n" -0ape '$_ = (join "&", @F)."\n"' file
perl -lne 'push @A, $_ }{ print join "&", @A' file
短い勝負なら
perl -pe 'eof||s/\n/&/' file
249を||使って書き直しただけだけどな
オレはmap大好き。
join('&',map{chomp($_);}(<>))
レンタルサーバでCGIを使っているのですが、Out of memoryが出てしまいました。
そこで、CGIが使用許可されている最大メモリ量を調べたいのですが、
Perl自体を使って調べるいい方法はないでしょうか?
>>254 1byteずつ、メモリを埋めていく。
一杯になったら、それが使用可能なメモリ容量。
レンサバはいろいろ制限されていることがあるので使えるかどうかはわからないが、
/proc/self/limitsを覗いてみるとか、syscallでgetrlimit呼ぶとか。
共用なんだろ?
あまり無茶をしてくれるなよ・・・
258 :
254:2009/12/15(火) 10:22:11
>>255 print length("x" x int(1024*1024*3.52)), "\n";
こんなコードでいいんでしょうか?
>>256 残念ながら/procがないんですよ。
getrlimitはunlimitedのようでした。
コードのつくりが悪いか、さもなくば追い出されるかのいずれかだな。
>>258 quataは?
個人的な感覚としては、共用サーバーで
Out of memoryと言われて、その制限を
調べようとするのは、逆恨みに近い気が。
そんなに使ってないはずなの?
261 :
デフォルトの名無しさん:2009/12/15(火) 21:21:06
あるスコープのレキシカル変数を自動的にハッシュにまとめる、というような操作はできないでしょうか。
perlでリフレクションというとシンボルテーブルへのアクセスですが、
レキシカル変数にはどうもアクセスできないように思いまして・・・
↓今現在の用途としてはこんな場面をイメージしています。
erb風のテンプレートクラスに値を渡す
(resultメソッド内でevalを実行するにあたり、現在は手作業でハッシュを作って渡しています)
my $name = 'my name';
my $output_text = $epl->result({'name'=>$name});
rubyではbindingオブジェクト、pythonではlocals()やvars()で
任意のスコープにあるすべての値を集めることができるので、近い形にできればと思ったのですが・・
erb.result(binding) #ruby
epy.result(locals()) #python
263 :
261:2009/12/16(水) 02:56:32
>>262 ありがとうございます。やっぱりCで書かれてるようですね。
こちらでも、perlの内部構造に直接アクセスすれば可能ということはわかったのですが
自分で書くにはハードルが高いようです・・・。
>>261のテンプレートクラスに関してはもう一案あるので、尚、検討してみようと思います。
というかテンプレートで使う変数はもともとハッシュに集めとけばいいんじゃね?
以下のコードを実行すると、
use strict;
use warnings;
use Encode qw(from_to);
use Encode::Guess qw( euc-jp cp932 7bit-jis );
my $data = '日本語';
from_to($data, 'Guess' => 'cp932');
print $data;
Use of uninitialized value in subroutine entry at D:/Lang/Perl/lib/Encode/Guess.pm line 56.
というwarningsが出るのですが、何が悪いのでしょうか?
ActivePerl 5.8.9、Windows XP SP2です。
なんで引数にハッシュ使ってんの
267 :
266:2009/12/16(水) 14:42:38
>>265 >Use of uninitialized value in subroutine entry at D:/Lang/Perl/lib/Encode/Guess.pm line 56.
これは値がundefの変数が使用されたことを示してる
>from_to($data, 'Guess' => 'cp932');
from_to($data, 'Guess', 'cp932');
こうじゃねーの?
>>268 なるほど
しかし、=>はハッシュの定義のみに使うべきだと思う
文字列短すぎて判別に失敗してるのかな
そうかそうか
Guessが使えるのは、Encode::decode
GuessはEncode::from_toでも使える
'日本語'はguessできるから、
from_toでGuessするなって言ってんじゃないの?
$enc->decode()の第2引数を省略せずにundefを
与えると警告が出るというところまではつきとめた。
use warnings;
use Encode qw(find_encoding encode);
$enc = find_encoding('cp932');
$s = encode('cp932', 'ほげほげ');
warn "check なし";
$enc->decode($s);
warn "check = undef";
$enc->decode($s, undef); # これだけ警告
warn "check = 0";
$enc->decode($s, 0);
Encodeでは省略可能な$checkパラメタをとる関数から
decode呼ぶときは、
$check ||= 0;
として確実に0にしてから渡しているのだが、Encode::Guess
のdecodeはその辺の配慮がされていない。どっちが正しい
のかはわからんけど。
真意は子飼氏のみ知るか。。。
Encode.pm使ってないけど、もうちゃんと動くの?
仕事で一回使ったけど、後でとんでも無く大変な目にあったw
utf8で使わなければ大丈夫なのかな?
むしろutf8以外で使うと面倒だと思うんだが
use utf8 で Encode.pm でcp932とutf8でもう
encode decode祭りで発狂寸前の俺がいる。
何がどうなってるのか訳解らんちん。
1年前にRubyだけ使ってたときは
「すべての文字列がエンコーディング情報を持つ、なんて面倒なことせずに
全部UTF-8に統一すればいいんじゃね」と思ってたが
PerlとEncode.pmを使い始めて理解した。統一方式はものすごく面倒だ
>>275 どういう使い方でEncode.pmを使ってたんだ
279 :
275:2009/12/16(水) 23:17:59
元々、画面SJIS、DB含めた内部がEUCのシステムを、画面・内部ともutf8に統一したシステムに変更した時にメール送信やメール送信や外部システムとの連携時の文字コード変換にEncode.pmを使った
単体テスト段階では気が付かなかったけど、DBのデータをコンバートのプログラムを作って実行した時点で文字化けがw
そのときにguessも使ったけど、文字数少ないとまともに文字コードを認識しないし、元々Jcode.pm使っててEncode.pmの使用実績も無いから、完全にEncode.pmに対する信頼性が全く無くなってなw
単体レベルの開発もほぼ終わって、結合・総合テストに入ろうとした段階だったのに、文字コード変換にかかわる部分をすべて手を入れててんやわんやw
多分、ウチの会社ではEncode.pmは二度と使わんな、きっと
280 :
275:2009/12/16(水) 23:20:37
ま、使い方が悪かっただけかも知れないけど、後でEncode.pmについてぐぐったらワロタw
まあ、Guessはシビアな場面でなくとも、まったく役に立たないね。
Guessだけのモジュール書いたら、需要ありそうな。
というか、Perlに限らず、入力コードのencodingを指定してないのなら、
変換失敗することがあるなんて当たり前でしょ
何のヒントも無しに文字コードの自動認識が完璧に出来るわけないんだから
論理的に決定できない場合が出るのは多少なりなりとも文字コードに
ついて理解があれば至極当然のこと。
だからといって、出来不出来の差がないなんてことはまったくない。
>>283 中学生はオナニーでもしてさっさと寝ろ。
乳か。
乳なんだろ。
爆乳問題か
>>284 プッ
guess と一緒に心中しろw
SJIS半角カナとEUCの区別だけやりゃよかった昔なら
いざ知らず、utf8とeucはかぶりまくりだからなぁ。
文字化けして困る用途ならguessなんかせずに文字
コードをちゃんと決めて使わないとね。
>>279 EUCからUTF8に変換したとき&とか変換できなくて困った覚えがある
あれ、Encode以外にEncode::EUCJPMSとか使わなきゃいけないんだよ
Encodeのバグかと思ったら、作者いわくEUC自体がまずいんだとか
290 :
275:2009/12/17(木) 18:31:16
最終的に文字コードの変換にはUnicode::Japaneseを使った
use utf8とno utf8つけることに統一したな
慣れないから文字数の入力チェックもどうするか悩んだw
>>289 EUC自体がまずいというかCP20932で定義されていないベンダ特有文字
が変換出来ないのは当然でそういった場合はCP51932使うのが普通でしょ。
guessに関しても対象文字列が全て定義されているか否かを調べるという単純な機能で
文字数が少なければ複数の候補が残る可能性が高まるし00-FF全て定義されてる
iso系なんかは全てパスしてしまう。
guessの候補が二つ以上残ったらdieするとか厳格すぎる気もするけどゆとり対応してないだけで
ユーザーの無知による誤った評価が多い気がする。
規制がやっと解除された。
>>261 Filter::Simple で適当にフィルタ書けば?
ってレスしたかったのに
perlが真面目にSJISに対応すればいいだけのこと
>>293 何をすれば真面目に対応したという事になるの?
>>293 今さらいらん。
utf8でおk。
それに、ShiftJISはもうあんまり文字を
追加できないだろ。
将来性がない。
UTF-8厨の勢力がどんどん増してゆく.....
常用漢字までsjis外の字が入るってのに、いまさら何を言ってるんだか。
こういうのをよくやるんですが、もっと簡潔な書き方はないでしょうか?
$_ =~ /(\d+)-(\d+)-(\d)/;
$year=$1;$month=$2;$day=$3;
特にグループが多くなった場合、対応がすぐわかるとうれしいので、
Pythonの名前付きグループ化みたいなのができればいいんですが。
my ($year,$month,$day) = split(/-/,$_);
301 :
デフォルトの名無しさん:2009/12/18(金) 11:00:22
>>296 > UTF-8厨の勢力がどんどん増してゆく.....
もう、ShiftJISなら3秒の処理をUTF-8にすると47秒かかるという時代じゃ
ないんだからさ……
>>300 それじゃ等価じゃないしやりたいことを単純化して説明しているだけかもしれないから
my ($year, $Month, $day) = /(\d+)-(\d+)-(\d)/;
の方が適切じゃない?
SJISならすっきり書けるコードがUTF-8だと汚くなるけどな
スピードは、どっちで書いても昔から一瞬だ
結局の所さんざん悩んだ挙げ句、SJISじゃダメでCP932に落ち着いたあの日...
>>301 EUCで14秒なのをUTF-8にしたら約3分ということがあったのを覚えている。
どんだけタコなコードなのか逆に見てみたいものだな
UTF-8で入力されたのをEUCに変換して処理してそれからUTF-8に戻すとか
309 :
デフォルトの名無しさん:2009/12/20(日) 06:36:28
5.6.**から使い始めた俺にすれば、
sjisに固執する奴の方が厨房に見える
バージョンは関係ないだろ
やろうと思う処理を素直に書くとUTF-8なんか入ってこない
perlのバグを回避する為に回り道させられてるだけ
ちゃんと表\示されればそれで十\分だよ
3,赤,#ff0000 1,青,#0000ff 2,緑,#00ff00がはいってる@allを
@all=@all[sort {$keys[$a]<=>$keys[$b]} 0..$#all];
ってやると
1,青,#0000ff 2,緑,#00ff00 3,赤,#ff0000
になるんですが
@all[sort {$keys[$a]<=>$keys[$b]} 0..$#all];ここの意味がよくわかりません
動き方がいまいち掴めません、詳しい方教えてください。
>>312 keysの要素の順番に沿うようにallをソート?
ようわからんけど
今色々試してみたんですが
@all=sort {$a<=>$b} @all;とやっても出来ました。
perl/CGIの極意600に書かれてた方法です上の難しい書き方は
@all=@all[sort {$keys[$a]<=>$keys[$b]} 0..$#all];
意味が同じってことですよね?
@keysの中身まで書かれてないと説明めんどくさいな。
@allの要素数は3なので、0..$#allは(0, 1, 2)の配列になる。
my @keys = (2,1,0)としておくと、
sort {$keys[$a]<=>$keys[$b]} (0, 1, 2);
は@keysの要素でソートされた順番で配列の要素が返り、(1,2,0)になる。
@all = @all[(1,2,0)];
は2番目・3番目・1番目の順で@allの要素を返し、@allに格納するので
結果は
>>312になる。
ここで@keysを
my @keys = (1,2,0);
と書き換えると、(2,0,1)の順番で@allの要素が返されるので結果は
2,緑,#00ff00
3,赤,#ff0000
1,青,#0000ff
になる。
ぶっちゃけややこしいね。
317 :
デフォルトの名無しさん:2009/12/20(日) 18:51:00
質問です
最近perlを使ってどんなことをやりましたか?
エロい画像の整理に使ってます
あなたみたいな人がこんなスレ見てるなんて驚きでつね
はい次
大抵はネット絡みだな
加工元のデータが自分の所で発生するケースはあんまりない
加工って、まさかエロ画像のデータを加工するのでつか?
>>319氏は ファイル名に対してオペしてるのかとおもいました。。。。。
はい次
エロ画像を大量にダウンロード
やっぱこれだね
どこに行けばエロ画像が大量にあるのかを知らない私にはどうでもいいです
それともエロ画像検索用にperlが走ってるのでしょうか。そんなわけはないな
はい次
2chでスレ立てとテンプレ貼りを数秒で終わらせるのにperlを使っています
>>325 スレ立ての頻度を考えれば手間対効果、効率の面で疑問ですね。
はい次
実際使い道が思いつかない・・・
perlやりとおしてるから意地はって適当に便利に使ってるふりしてる。
虹画像の収集に使ってます
全角数字を半角数字に変換したい
※ただしローマ数字は除く
ということをやりたいんですが、ローマ数字が文字化けしてしまいます。
どうしたらいいでしょうか。
SJISのテキストで保存されたファイル内の全角数字を半角数字に変換してSJISで保存したいです。
たとえば、「12VWX6789」→「12VWX6789」と変換したいのですが、
下記の方法では「12?V?W?X6789」となってしまいます。
試したこと1:
$test = decode('sjis', $test);
$test =~ tr/\x{ff10}-\x{ff19}/0-9/;
$test = encode('sjis', $test);
試したこと2:
use Lingua::JA::Regular::Unicode;
$test = decode('sjis', $test);
$test = alnum_z2h($test);
$test = encode('sjis', $test);
試したこと3(スクリプトもSJIS)
use Jcode;
$from = jcode('[0-9]')->euc;
$to = jcode('[0-9]')->euc;
$test = jcode($test)->tr($from, $to)->sjis;
# このスクリプトはutf8で保存
use utf8;
use Encode;
# ファイル開いてSJISのバイナリ列持ってくる
my $test = ...;
# flagged-utf8にして
$test = decode 'cp932', $test;
# tr///で全角数字を半角にして
$test =~ tr/0-9/0-9/;
# SJISバイナリ列に戻す
$test = encode 'cp932', $test;
print $test;
画像の収集とか、ネットラジオの収集とか、
自動ツールがあるけどいたちごっこで対策されたりしてる分野に、
自分専用スクリプトを書くとかなり効果的だな
>>328 虹が好きなんですね。
どうやったらperlが「おっ、虹画像見っけた」って判断できるのか?おせーてください
>>331 ネットで公開してるくせに自動ツールは拒否したりするのですね。ネットって不思議ですね
はい次
#!/usr/bin/perl
@ls=`ls -al`;
foreach (@ls)
{
s/rwx/7/g;
s/r-x/5/g;
s/rw-/6/g;
s/-wx/3/g;
s/--x/1/g;
s/-w-/2/g;
s/r--/4/g;
s/---/0/g;
}
print "@ls";
パーミッションを分かりやすく表示してる
スレ保持数の厳しい板でスレの自動保守をさせる
保守合戦になっても絶対生き残る
>>334 保守age
保守age
保守age
保守age
ってのがそれですね。需要がないのを理解してください
はい次
>>333 こ、こ、、、これは?
数字のほうがわかりやすい?????
へんな人ですね
あと、ファイル名に rwx なんてのがあったら可笑しくなりそうなので
タンゴ協会みたいなのいらないですか? g なんていらなくない?
はい次
なんでいちいち10桁も見ないといけないんだよ
ファイル名にrwxなんて使うのか
ugoの3つあるからgは必要
はい次
おっとーーーー
俺間違えてるワラワラワラ
-rwxr-xr-x
自分、グループ、他人だっか?でならんでるのか
じゃ、変換してよろし
ただg はいるじゃんw
はい次
あ、そうそう、
致命的なバグがあるね
>>ファイル名にrwxなんて使うのか
はい次
340 :
329:2009/12/21(月) 00:03:05
>>330 うまくいきました!
sjisではなくcp932を使うんですね。
なるほど・・・これは知りませんでした。
ありがとうございます。
use List::Util 'sum';
my @ls = `ls -al`;
s{(?<=^\S)([r-])([w-])([x-])([r-])([w-])([x-])([r-])([w-])([x-])}
{ @_ = map { $$_ eq '-' ? 0 : (4,2,1)[($_-1)%3] } 1..9; join '', sum(@_[0..2]), sum(@_[3..5]), sum(@_[6..8]) }efor@ls;
print @ls;
これでいいんだろ
>>341 練習問題としては勉強になります
ただ >>318への回答としては、失格です
はい次
別にお前に話してない
はい次
失礼しました
はい次
荒らすなゴミ
euc厨が自分の恥を流そうと必死なんだろ
341の正規表現書いたあとに見直したら無駄多すぎだったから訂正しとくわ
s{(?<=^\S)([rwx-]{3})([rwx-]{3})([rwx-]{3})}{ join " . ", map { (local $. = $$_) =~ y/rwx-/4210/; join "+", split //, $. } 1..3 }ee
関係ないので
はい次
-rwxr-xr-x
のほうが見やすい
はい次
スレ判定してここでレス書く時だけ、末尾に「はい次」を自動で入れるようにしてます
はい汁
つstat
はい次とかほざいて
サバサバ気取ってるのわかる
心の広い人間に憧れる乙
354 :
353:2009/12/21(月) 10:52:35
すみません
Net::DNSの「::」の意味を考えたら
自己解決しました
スレ汚し申し訳ありませんでした
はい次
perlのgethostbyaddrが遅いって本当なん?
単純にOSが用意したgethostbyaddr(3)を
呼んでそうなもんだけど。
自分でソース読んで確かめろって話だけど、
この手のシステム依存部分って抽象化と
場合分けがぐじゃっとしていて読みにくいん
だよな。
>>353 Strawberry Perlを使ってるのか?
Active Perl 5.8/5.10ならppmにあるし、そちらを使う方が楽だと思うが
>>358 自分の人としてのレベルの低さ、みみっちさに早く気づいてください
はい次
最近へんな人が張り付いてるなぁ
クリスマス前に振られたのか?
perl使いの皆様の本職を教えてください
研究者
365 :
275:2009/12/21(月) 20:10:47
>>363 システム開発者
今もperlでWEBオープン系の仕事してる
PHPもするし、汎用系もなんでもするよ
趣味で遊ぶのはperlだな
でも実用性重視で、細かいことは気にしない
ニート
ぼくも研究者
俺も研究者 アニメの
369 :
275:2009/12/21(月) 20:29:25
金持ち
研究者、結構いるんだな。
おれも研究者……4月以降どうなるかわからんが(泣
371 :
デフォルトの名無しさん:2009/12/21(月) 22:39:19
DBI.pmについての質問はここでOKでしょうか。
以下のようなプログラムがあるとします。
Shift_JISの文字列に対し、DBIのquote()メソッドを使ってサニタイジング&シングルクォート囲むプログラムです。
use DBI;
my $dbh = DBI->connect(略);
my $inStr = '出席表\'; #いわゆるダメ文字が最後に来る文字列
my $outStr= $dbh->quote($inStr);
print "$outStr\n";
さて、このプログラムを構成の異なる2つのサーバで実行したところ、出力に差異が生じました。
サーバA(perl 5.0+DBI 1.37) → '出席表'
サーバB(perl 5.6+DBI 1.67) → '出席表\'
サーバBの出力のままでは、シングルクォート自体がエスケープされることになり、DB(MySQL)に投げることができません。
このような違いは何が原因で起きるのでしょうか?
何かヒントなどあればよろしくお願いします。
・DBに投げる際、プレースホルダを使っても変化なし
・スクリプトの文字コードをEUCやUTF-8にしても変化なし
・「表示」のように、ダメ文字が最後に来なければ問題なく動く
use utf8しろ
>>372 与えられる文字列そのものがShift_JISなので変わりません
意味不明。
はいどんどん
>>371 '出席表\'は実際のスクリプト中でも、そのまま書かれているんだよね?
それとも実際のスクリプトでは、$inStrは外部から読み込んできた文字列になる?
それと、372の言う通りuse utf8は試してみた?
>>374 すみません、色々テンパってました
>>376 あ、はい。実際には外部からの入力です。
use utf8は既に試しています。
調べているうちにuse encoding 'shiftjis' というプラグマを見つけたのでそっちも試してみます。
GTK2で常駐型のアプリケーションを作りたいと思っています
どうすればパネルにアイコンを置くことができるでしょうか
よろしくお願いします
GUIならコンパイラ言語で作れ
はい次
老害
年末に職を失ったのかな
相手にしないことだ
いまどきEUCとsjisで的はずれな書き込みがあるからって教えられてみたけど
確かにeuc厨すごいなww
どうした?シフトJISのソースファイルの「ソ」の後ろに\を付ける仕事に飽きたのか?
もうShift_JISさんは許してやれよ
Shift_JISさんを許しても
息子のcp932さんが仇討ちに来るがな・・・
388 :
デフォルトの名無しさん:2009/12/23(水) 17:07:32
馬鹿がひとり粘着してるのか?
そこでjperlですよ
郵便配達のバイトしてます
391 :
デフォルトの名無しさん:2009/12/23(水) 21:50:45
コマンドライン上で、一度表示したものを消して再表示するにはどのようにしたらよいのでしょうか?
具体的には処理の進捗状況を出したくて、一度表示した後に何秒後かにそれを消してまた表示するという感じなのですが。
エスケープシーケンスで行頭に戻す
>>391 \b(バックスペース)か\r(復帰)を使って消せるよ
394 :
デフォルトの名無しさん:2009/12/23(水) 23:13:56
質問が理解できない・・・・・・
はい次
バカは黙ってろ
はい次
キャリッジリターンってまさにその為の制御文字だしな
バカは黙ってろ
はい次
イブなのに
悲しくならないか?
EUCになに期待してんだよ
自演でしか勝者になれないヘタレ乙
はい次
Perl6のリリース日程が公式に公開されてるから今年のクリスマスwktkは無いの?
むかし、JIS対EUC闘争というのがあってのう。
UTF-8の台頭で、規模縮小したアレのことだな。
405 :
デフォルトの名無しさん:2009/12/24(木) 19:37:50
perl/tk やってる人いない?
ファイルサイズが大きくなってくるとセグメンテーション・フォールトで止まちゃうんだけど。。
ファイルを二つに分けると普通に動く。
これは仕様なの?
仕様と言うより、限界?
407 :
デフォルトの名無しさん:2009/12/24(木) 21:47:29
PSGI/Plack の勢いが凄まじいな。こういうのが間歇的に発生するからこの糞言語が終わらないんだよな。
perlはLEGOなんだよ
Perlは可読性を除き神言語
素材としては最強
CPANがあるからPerl使う
>シフトJISのソースファイルの「ソ」の後ろに\を付ける仕事
「刺身の上にタンポポのせる仕事」より酷いな
cpanがよくわからん。
unixでしかも英語力があれば何とかなるのかいな。
windowsでしかも英語力がないと、モジュールを組み込むのは不可能だ。
何でインタプリターなぼろい言語なのにこのプログラム使うんだ
BASICがインタプリターでぼろいというなら、
Perlも同じくインタプリターだからぼろい。
BASICの話なんか誰がしてるんだよ
異常性格言語その名はPerl
perlはレコード型の変数ってないんだろ。
連想配列
VisualBASIC舐めんな
連想配列を使うとレコードもどきはできるが、
レコードの配列は無理だろう。
Class::Structあるだろ
ラリーはなぜ、Cからswitch- case文やstructを除外したのか。
structはともかく、Switch文が組み込みでないのは本当に謎だ
ライブラリで実現できるものは言語コアに入れなかっただけじゃないの
>>429 その理屈なら、printfも言語コアには入らないことになるぞ
とりあえず使う予定がなかったからだろ。
>>433 言語に組み込むことと、組み込みライブラリに含めることではレベルが違う
>>434 言ってることがよくわからん
関数だろうと制御文だろうと、コア機能であるべきものは言語に組み込むべきだろう
言語コアとライブラリの区別ができんようなやつがプログラミング言語を設計したときにできるのがPerl4みたいなゲテモノ
「言語コアはすべて暗記しなければならない」
「ライブラリは暗記しなくていい」
という幻想
そこらの言語に比べて組み込み文法があれだけ多いのに、switchが無いのは確かに謎だな
俺はCとは違うんじゃー っていう変な新年で外されたとしか思えん
単純にswitchの実装が面倒で、避けただけだと思う。
>>439 Cじゃなく、sh+awk+sedと比べるべき。
442 :
デフォルトの名無しさん:2009/12/26(土) 20:04:37
規制中なので携帯から失礼します。
低レベルな質問なんですが
テキストのIPアドレスを読み込み、逆引きして
ドメイン名検出をしようとしてるのですが
どうもうまく行きません
以下のプログラムでやっているのですが
結果は
ドメイン不明
ドメイン不明
・
・
・
となります。
テキストファイルの中身は
一行に一つのIPが書かれている状態で
それが約5万件ほどです。
443 :
デフォルトの名無しさん:2009/12/26(土) 20:06:49
use strict;
use Net::DNS;
use vars qw/ $myRes $query $rr $host $str @word $st /;
$myRes = Net::DNS::Resolver->new;
sub myLookup($){
$query = $myRes->search($_[0], 'PTR');
if (!$query) {
return "ドメイン不明";
}
foreach $rr ($query->answer) {
if ($rr->type eq "PTR") {
return $rr->ptrdname;
}
}
}
open(FILE,"<IP.txt"); #ファイル読み込み
while ($str = <FILE>){ #ファイル関連
$host = &myLookup($str);
print $host."\n";
}
close(FILE);
プログラムはこのようになっています
本当に低レベルな質問なんですが
どうかご教授お願いします
444 :
デフォルトの名無しさん:2009/12/26(土) 20:18:52
ちなみにIPを一つだけ入れるとうまく行きます。
$host = &myLookup("202.131.30.146");
このようにテキストから読み込むプログラムは
書かずにそのままIPを入れると正常にドメインが出力されます
。
結果は
crawl-202-131-30-146.naver.jp.ne.jp
(これはテキストの一行目のIPのドメインです。)
以前に似たような形でカントリーコードを
出力させるプログラムは普通に動きました。
ソースがレガシーすぎてちゃんと読む気おきないけど、
$host = &myLookup($str);
の前に
chomp $str;
を入れてみるとか
chompだろうな
やはりchompか
そうか、レコードの配列はハッシュのリファレンスを配列に詰め込めば、
もどきなことができるのか。
何で、こんな裏技的な方法で、もどきなことをさせるのか。
解決策を見つけるまで、回り道をしながら余計な学習時間が掛かったじ
ゃないか。
異常性格なPerlのぼろさだ。
特殊変数とかマッチ演算子とかあらかじめ学習しておかないと解読できない
異常性格言語Perl。
Perlが完全に未学習で初めてなのに、いきなりソース持ってきて、このCGI
を作れと言われて、俺の知能が低いからソース読めないと思ってたが、実は
ソースが汚いとか可読性が悪いとか随分評判が悪いらしい、異常性格なPerl。
オブジェクト指向プログラミングももどきなパッケージで実現する
異常性格なPerl。
確かに知能は高くなさそうだな。
CやC++スタイルのコメントも使わせない、異常な#を使わせる、異常性格なPerl。
ラクダ本の能書きを読まずに、普通の入門書とかだけでは、
何かよくわからないまま、この場合はこのように対応する
らしいから、それに従うみたいになるだけで、応用力を身
に付けるのには適してないように思える。
なぜだ、それだけ異常性格なPerlだからか。
普通の知能の人が普通に勉強すれば絶対詰まらないところで詰まった経験なんて、
いくら話しても馬鹿にされて終わるだけですよ。
Perlができなくて、危うく首になりそうになった異常性格な言語Perl。
>>454 普通に勉強する準備時間も無い状態でいきなり仕事やらされたんだぞ。
>>456 普通じゃない状況のせいだとわかっているなら、言語批判に置き換えるのはおかしい。
あと、普通の知能の持ち主だったら、その状況でももっとマシな仕事できてたろうね。
PHPなら全く初めてでも対応できた
だがPerlは異常だからそうはいかないから言語批判
俺はどっちも普通に対応できたから
片方でヘマこいた人のレベルが低いようにしか思えない。
while (<FILE>)ではなく、while(<>)て何のファイル読んでるんだ。
この異常性格Perl。
この子のなにが凄いって、ここに書き込んだ例のすべてが
普通の人ならPerlを初めて触った日の最初の3時間で解決するレベルの
基本事項だってことだな。
慣れれば慣れるほど、コードが読めなくなっていく
ぱっと見Cみたいに見える頃はとても読みやすい
3時間で解決する調べ方教えてくれ。
本読んでも何の前触れもなく突然意味不明なコードが出現したり、
目次や索引とかgoogleで常に疑問の解決に直結する情報が即座に
得られるというわけでもないし、地道に順を追って学習せざるを
得ないことが多い。
>>440 if+elseは、内部でswitchのように
実行される(こともある?)らしいので、
実装難度が理由ではない。
つか、switchくらい面倒なわけないだろ。
理由は、後方互換と意地だと思う。
Perlにはラベルがないからな
記号を検索しにくいなら、検索しやすい名前で一通りラップすればいいんじゃないか
そういうライブラリって既にある?
468 :
466:2009/12/26(土) 22:49:18
いや、あるし。何を言ってるんだ
470 :
442:2009/12/26(土) 22:53:00
>>445,446,447さん
見難いコードにも拘らず
ありがとうございます
上手く起動しました。
chompを調べたところ
行末の文字を消去すると出ていたのですが
どうやらCR+LFの改行コードで詰まっていたんですね
どうやら、Perlを使うほど人間も異常性格になって、人を馬鹿にしたいらしい。
直感で理解するにも限度がある、学習の裏付けがないとソース読めない異常性格Perl。
異常性格製造機Perl
>>471 まだ俯瞰で物を見る力が残っているなら、客観的に周り見てみ。 誰が一番異常か。
\ /
\ 丶 i. | / ./ /
\ ヽ i. .| / / /
\ ヽ i | / / /
\
-‐
ー
__ わ た し で す --
二 / ̄\ = 二
 ̄ | ^o^ |  ̄
-‐ \_/ ‐-
/
/ ヽ \
/ 丶 \
/ / / | i, 丶 \
/ / / | i, 丶 \
みんな仲良く汁!!
あと難しい言葉使うな!!
switchってどうインデントするのが正解なんだろ
480 :
475:2009/12/27(日) 00:29:20
Perlは確かに異常だよ。
try- catchではなくeval- if(@)を使わせる異常性格
Try::Tiny使えばいいじょう性格
switch caseの話題でgiven whenが出てこないスレwww
try catchって、ずっと use Error qw(:try) でやってたよ。
given when って知らなかったな。って、5.10からか。
仕事で使ってる人は、圧倒的に5.8系が多いんじゃないか?
俺がそうだから、みんながそうだとは限らんけど、RHEL使ってるなら、そうだよね。
5.10や、6の機能なんか調べても意味ないから調べないな。
5.10はもうちょっとして、新規の案件があれば調べるかも、程度だなぁ。
6はちょっと論外だなぁ。5年後くらいには、5.10がメインになってるかもね。
でも、Perl6::Sayは使っちゃう。
一応 Solaris8で使うことも考えるから、基本は Perl 5.00503 かな
Solaris9 前提なら Perl 5.6.1 でもいいんだろうけど
スマートマッチもあるしね。
今からPerlやるとか変態だろう。
RubyとかPythonがある今で。
ギドがもうちょっとイケメンだったらPythonに乗り換えてた。
>>487 うへぇ、そういう環境って、やっぱCPANもろくに使えないとか?
Perlって、CPANなけりゃとてもとても使えたもんじゃねーって思ってる。
perlのリストというのは、配列と同義だろうか。
配列のperl用語だろうか。
そうか、コンマで区切ってカッコでくくったものがリストらしいな。
それに対して配列は、リストの受け皿である変数のことを言うんだろうな。
perlのlはリストのlだ
>>490 CPANのパッケージは、比較的最新のPerl版数を要求するものが多かったり、
他のパッケージを要求するものが多く、芋づる式にたくさんのパッケージを
入れると、どこかで Perl 版数に引っかかったりして、こういう環境では使いづらいね
でも、素 Perl であっても、シェルスクリプトでは出来ないことが出来るし、
全然役に立つ。Solaris8以降なら最小インストールでも入るのも大きい
perlを多用するようになったのはエクセルでは開けない巨大なデータを扱い始めてからだったなあ
エクセルで並び替えたり変換したり抽出したり計算したりを全部perlでやるようになった
負荷の高い数値計算とかだと今でもCだけど
#!/local/usr/bin
から
#!/usr/bin
に変わった時はうれしかったよ
間違えた
#!/usr/local/bin
だたw
#!/usr/bin/env perl
とかできひんの?
でけへん
>499
use Perlのjournalとか読んでるとサンプルソースで#!/usr/bin/env perl
って書いてるのをよく見かけるな。
>>499 その書き方は、稀によく見掛けるね
自分は好きじゃないけど
「稀によく見掛ける」
>>230 規制中による遅レス失礼。
うまくいきました。
カーリーブレースがデリファレンスの正式な方法って知らなかった。
続•初めてのperlを買ったら、載っていて理解した。
デリファレンスは%部分だろ
無センス
%$a{b}
正確に言うとphpなんですがpreg系の正規表現置換で、
バックスラッシュ以外の一文字っていう正規表現がわかりません。
/[^\\]/
かなと思ったのですが[]が閉じてないと言われてしまいます。
/[^\]/でも同様でした。
文字列を指定した文字で、分割したくて、エスケープ処理も使いたいってことなんですが、
1:2\::3
↑この文字列を1,2:,3に分割したいってことで\が前にない:で分割ってのをしたいんです。
よろしくお願いします
PHPの正規表現は知らんが(すれ違いだし)
511 :
510:2009/12/28(月) 17:05:25
否定先読みでも使えばいいんじゃないの
pregって一応perl準拠なんですが・・・。まあ完全に一緒ではないのかもしれません。
あーこの場合だと、否定後読みか?
>>509 phpは正規表現リテラルがなくて文字列で表すので、
/[^\\]/
を得ようと思ったら、
"/[^\\\\]/"
と書かなきゃいけないんじゃなかったっけ。(めんどくさー)
まあスレチだからちゃんとききたきゃPHPスレで。
>>511 /(?<!\\)\:/
こういうことですか?これでも()が閉じてないと言われてしまいました。
/(?<!\\\\):/"
でいけました。スレ汚し失礼いたしました。
ああ、なるほどね
phpだと関数だからstringで渡さなきゃいけないのか
Mechanize使ってWebページのフォームにあーだこーだすることはできたんですが
flashplayerにあーだこーだすることはできませんか?
具体的にはニコニコ動画のコメントを読み込んだり書き込んだりしたいんですが
APIが用意されてたんですか
ありがとうございます
521 :
デフォルトの名無しさん:2009/12/28(月) 23:22:50
/ ̄ ̄ ̄ ̄ ̄\
| ^ U |
| |ι |つ
U||  ̄ ̄ ||
 ̄  ̄
523 :
デフォルトの名無しさん:2009/12/29(火) 08:06:14
既存のモジュールに多少手を加えたものを作ろうとしているのですが、
たとえば/usr/local/lib/perl/5.10.0/xxx.pmを多少変更したxxx1.pmというのを作って使おうとしたら、
どうやって読み込めばいいでしょうか?
よろしくお願いします。
524 :
デフォルトの名無しさん:2009/12/29(火) 08:10:14
というか、モジュールが@INC以外に存在するとき、どうやって場所を指定すればいいでしょうか?
525 :
デフォルトの名無しさん:2009/12/29(火) 08:11:14
自己解決しました。
use lib /home/perl/Modules;
use NewModule;
でした。
>>523 /home/hoge/lib/xxx1.pm
に設置したとしたら、スクリプトの冒頭(じゃなくてもいいんだけど)で、
use lib qw(/home/hoge/lib);
とすると吉。
>>525 俺の立場をどうしてくれるw
まあ、use libの後は何らかの引用符で囲んでリストで渡すように。
528 :
デフォルトの名無しさん:2009/12/29(火) 08:21:46
527さん
ありがとうございました。qwでやります。
529 :
デフォルトの名無しさん:2009/12/29(火) 08:58:01
>>525 それで出来るんだね。
push(@INC, '/home/perl/Modules');
ってやってたけど、そっちのがよさげだね。
>>529 あれっ、それ無理でしょ。
@INCはコンパイル時に評価されるから。
BEGINでくくるなら別だけど。
perlでuniqって簡単にはいかないんですか?
@list=uniq @list
みたいな?
無理
そうですか。。。。
自力で重複分を捨てないといけないのですね?
需要高そうですけど、、、、、、どなたかコピペお願いします
でもcpanモジュールにあったと思うぞ
List::MoreUtilsにあったはず
>>533 Perlクックブックより
my %seen;
@list = grep !$seen{$_}++, @list;
欲わかんなかったので書いてみた
@id=sort @id;
for(@id){
unless($temp eq $_){
push(@temp,$_);
}
$temp=$_;
}
for(@temp){
print;
print "\n";
}
プロフェッショナルな皆さん、評価お願いします
配列作るときに
$hash{$_}++
ってして
@list=keys %hash
で良いんじゃないの?
うむ・・・・
上のほうの方も、
>>最初から
>>配列作るときに
の方も、、、根本的にプロフェッショナルの方はやり方が違うのですね・・・・
尾恥ずかしながら、最初 @id を作ってるところがこんな感じです。
ここでハッシュというものが登場するわけでしょうかww
while(<>){
if(/(\d\d:\d\d:\d\d).*ID:(........)/){
#print "$2"."\t";
#print "$1";
#print "\n";
push(@id,"$2");
}
}
>>539 これで動いたみたいです!!
ありがとうございます。勉強します
while(<>){
if(/(\d\d:\d\d:\d\d).*ID:(........)/){
#push(@id,"$2");
$hash{$2}++;
}
}
@list=keys %hash;
#@id=sort @id;
#for(@id){
#unless($temp eq $_){
#push(@temp,$_);
#}
#$temp=$_;
#}
for(@list){
print;
print "\n";
}
ちなみに
%hashのkeyあたりどれぐらい重複していたかは
$hash{key}
で分かるよ
これって今の場合はともかく、@listが何かへのリファレンスだったらまずくない?
そりゃ、uniqを取ると言う目的とは別の処理の問題だろ。
リファレンスが対象だったとしたら、「リファレンスのアドレスが同じ」か、
「リファレンスの中身(例えば中身のスカラーが同じとか)が全て同じ」かで
処理は全く変るわけだし。
前者だったら、Scalar::Util の refaddr 関数とかで各固有のアドレス(数値)を
得てハッシュに突っ込む。
Scalar::Util qw( refaddr ) ;
my %seen ;
my @arr = .... ;
my @uniq = grep { ! $seen{ refaddr $_ } ++} @arr ;
# + 0 でいいじゃん、なんて某氏が言いそうな突っ込みは禁止。
545 :
デフォルトの名無しさん:2009/12/31(木) 21:56:34
大晦日に失礼致します。
数日前から色々と苦戦しています。。
当方、超初心者です。
現在、CGIのページで携帯のチャットサイトを作っています。
携帯の機種名を取得して表示したいのですがうまくいきません。
-----------------------------------------------------------
sub html_view {
&html_header;
if ($FORM{'mode'} eq 'reg') { &html_form2; }
else { &html_form1; }
@DATA = &read_file($datefile);
$kizi = @DATA;
if($kizi >= $max_page) { $dataview = $max_page; }
elsif($kizi < $max_page) { $dataview = $kizi; }
foreach (0 .. ($dataview - 1)) {
local($date,$name,$com,$cl) = split(/,/,$DATA[$_]);
chop($cl);
print "<HR SIZE=1>\n";
$name =~ s/\0/,/g;
$com =~ s/\0/,/g;
print "<FONT COLOR=\"$cl[$cl]\">$name</FONT>\>$com<br>★($date)\n";
}
&html_footer;
exit;
}
-----------------------------------------------------------
上記のソースの★の部分に携帯の機種名を表示したいのです。
546 :
デフォルトの名無しさん:2009/12/31(木) 21:58:01
色々と調べて、CGI、perlで表示できそうなサイトをみつけました。
(
http://www.kawa.net/works/perl/phone/pnews.html)
テストとして、こちらのサイトさんのプログラムをダウンロードして、
phone.plをアップロード、そしてtest.cgiを作り、
------------------------------------------
#!C:/perl/bin/perl
print "機種名: $phone->{name}<BR>\n";
------------------------------------------
として保存してtest.cgiにアクセスしましたが、
internal server errorと表示されてしまいます。
どのようにしたら、★の位置に携帯の機種名を表示できるのでしょうか・・・
どうかよろしくお願い致しますm(_ _)m
547 :
デフォルトの名無しさん:2009/12/31(木) 22:32:48
大晦日に失礼致します。
数日前から色々と苦戦しています。。
当方、超初心者です。
現在、CGIのページで携帯のチャットサイトを作っています。
携帯の機種名を取得して表示したいのですがうまくいきません。
-----------------------------------------------------------
sub html_view {
&html_header;
if ($FORM{'mode'} eq 'reg') { &html_form2; }
else { &html_form1; }
@DATA = &read_file($datefile);
$kizi = @DATA;
if($kizi >= $max_page) { $dataview = $max_page; }
elsif($kizi < $max_page) { $dataview = $kizi; }
foreach (0 .. ($dataview - 1)) {
local($date,$name,$com,$cl) = split(/,/,$DATA[$_]);
chop($cl);
print "<HR SIZE=1>\n";
$name =~ s/\0/,/g;
$com =~ s/\0/,/g;
print "<FONT COLOR=\"$cl[$cl]\">$name</FONT>\>$com<br>★($date)\n";
}
&html_footer;
exit;
}
-----------------------------------------------------------
上記のソースの★の部分に携帯の機種名を表示したいのです。
ごめんなさい・・
二回書き込んでしまいました。
>>546 httpヘッダ出力してねえのに、エラー出ない訳ないわなw
追記
cgiに関することはスレ違い
>>549さん
ありがとうございました!
やってみます!
>>550 すみません。
適切なスレを探したいと思います。
packで"p"、"P"ってどういう使い方をするのでしょうか?
簡単な例で説明してくれると嬉しいです。
p 文字列へのポインタ
P 構造体 (固定長文字列) へのポインタ
ポインタが取得できる
4桁の16進数の文字列をunsignedの数値にしたい時、
どうunpackすれば?
hex $hoge;
つまり、unpackでは無理だと
Win上の activeperl について質問です。
wperl を使ってウィンドウを出さない状態で
実行したいのですが、スクリプトの中で
バッククォートとか system を使うと、
DOS窓が出てきてしまいます。
DOS窓を出さずに、相当のことができる方法は
何かありますでしょうか?
>>558 ていうか今時バッククオートとか有り得ないから。
同等の機能を持ってるモジュールがあるはずだから、
ググって探せ。
>>557 一発じゃ無理じゃないんかなあ。
unpack使いたいなら、一旦普通にunpackしてMSB立ってたら1の補数を取れ。
それか一旦4バイト列にするかだが、補数取る方がコスト低い希ガス。
×4バイト
○2バイト
先生質問です。
日本語処理の正規化について
これを読めば一通り理解できるってサイトや書籍ってありますか?
もしくは何らかのヒントが欲しい。
>>562 「日本語処理の正規化」ってどういうこと?
内部エンコーディングのUTF-8で扱う、って話なら
「perl encode」でググれ
やっぱり他の人も判らないのか
情報科学の最近の課題なのかと思った
形態素解析みたいなことかな?
形態素解析とか表記揺れ吸収とかの話だとしたらまあスレ違いだわな。
具体的にこれこれこういう処理をPerlで実装したいとか言うんならともかく。
単に日本語が不自由な人だったに一票
質問者を叩くの楽しいなあ
どこにでもクズは居るね
Unicode正規化のことなんじゃねえかなぁ
572 :
デフォルトの名無しさん:2010/01/04(月) 14:06:20
573 :
デフォルトの名無しさん:2010/01/04(月) 14:07:47
572です。
…私はWEBプログラミング板で質問するべきだったのでしょうか??
失礼しました!
574 :
デフォルトの名無しさん:2010/01/04(月) 19:28:02
if (($pc_auction) and ($auctype) and ($session_endtime > time())) {&pcuser;}
if (($userid eq 'root') and ($action eq 'scoredsply')) {&scoredsply;}
if ($action eq 'calldsply') {&calldsply;}
elsif ($action eq 'formdsply') {&formdsply;}
elsif ($action eq 'accept_sell') {&accept('accept_sell');}
elsif ($action eq 'accept_buy') {&accept('accept_buy');}
elsif ($action eq 'cancel_sell') {&accept('cancel');}
elsif ($action eq 'cancel_buy') {&accept('cancel');}
elsif ($action eq 'call_sell') {&callsave('sell');}
elsif ($action eq 'call_buy') {&callsave('buy');}
elsif ($action eq 'call_mess') {&callsave('message');}
elsif ($action eq 'ses_start') {&session_start;}
elsif ($action eq 'ses_end') {&session_end;}
elsif ($action eq 'logoff') {&logoff;}
elsif ($action eq 'final') {&final;}
elsif ($action eq 'newauction') {&newauction;}
elsif ($action eq 'backup') {&backup;}
elsif ($action eq 'payofftable') {&payofftable;}
elsif ($action eq 'pricetable') {&pricetable;}
elsif ($action eq '') {&framedsply;}
exit;
どういう処理がなされているのでしょうか?
色んな処理
switchにして欲しいね
$switch{$action}->();
で済みそうな。
いまどきこんな書き方する奴が居るのか
動作コストも少なく済みそう。
素直な書き方ではあるけど、elsifと$actionを何度も書くのが格好悪いので、
スマートに書こうと無駄な努力をしがち
ディスパッチャか
ていうかwebprog板で報酬を要求されたからって
こっちに戻ってきてもいいことないぞ
Perl学習中です。
ある文字列について一定確率で文字を置換するプログラムを作りたいのですが
いくつか条件があるために頭が混乱してしまいます。
そもそも一定確率でランダムに置換する方法が分からないのですが・・。
条件1.一文字一文字に対して一定確率で文字置換が起こるようにする。
条件2.置換を起こさない文字もある。
----------------
AADBCCBCDACA
| | || |
BADCAACCDABA
----------------
上の例で言えば
条件2:Dは置換することはない
条件1:A,B,Cはそれぞれ一定の確率で、A,B,Cのいずれかの文字に置き換わる。
例では1/2。*結果的には1/2になっていなくても良い。
置換後の配列と元の配列それぞれのABCの含有量は一緒でなくても良い。
文字を一文字ずつ認識することはできているのですが、この先どうすればいいのでしょうか。
ご指導よろしくお願いします。
図の線がずれてしまいました><
%r = (
'A' => 0.5,
'B' => 0.5,
'C' => 0.5,
'D' => 1,
);
foreach (split//,'AADBCCBCDACA') {
$s .= rand(1) < $r{$_} ? $_ : ('A','B','C')[rand(3)];
}
print $s;
↑すまん。これはダメ
int付けろよw
%r = (
'A' => 0.5,
'B' => 0.5,
'C' => 0.5,
'D' => 1,
);
print join ('',map {rand(1) < $r{$_} ? $_ : ($_ eq 'A' ? ('B','C')[int rand(2)] : ($_ eq 'B' ? ('A','C')[int rand(2)] : ('A','B')[int rand(2)] ) );} split//,'AADBCCBCDACA');
あ、join不要だった
寝よう…
D以外は、該当文字の確率を倍にして全部乱数にかければいいべ
$_="AADBCCBCDACA";
$l="ABC";
s/[$l]/int rand 2?(grep$&ne$_,split"",$l)[rand -1+length$l]:$&/eg;
print;
ABCが置換される確率1/2固定だけど
Perlには予約言語の種類がたくさんありますが全部覚える必要はありますか?
>>591 $foo{log} = "$time: written\n";
みたいなクオート略記を多用するなら全部覚える必要あり。
ついでにインポートした関数もな。
ちなみに上記はlogが予約語なので期待した動作をしない。ありがちなミスの例として有名。
>>590 三項演算子の条件部で各文字の確率と比較してあげればいいよね。
my $str = "AADBCCBCDACA";
my %r = (
A => 0.5,
B => 0.5,
C => 0.5,
D => 1,
);
my @chrs = grep $r{$_} != 1, keys %r;
$str =~ s/(@{[join '|', @chrs]})/
rand() < $r{$1} ? (grep $1 ne $_, @chrs)[rand $#chrs] : $1/eg;
>>592 へーと思って試してみたけど特に不思議なことはないみたいなんだが??
% perl -MData::Dumper -e '$foo{log} = 1; print Dumper(\%foo)'
$VAR1 = {
'log' => 1
};
バージョンは
This is perl, v5.10.1 (*) built for i486-linux-gnu-thread-multi
$foo{log(1)}にしたときは関数として評価されて関数の返り値がハッシュのキーになるね
perlrefのNot-so-symbolic referencesのあたりにはっきり書いてあるね。
ですから、
$array{ "aaa" }{ "bbb" }{ "ccc" }
の代わりに以下のように書けて:
$array{ aaa }{ bbb }{ ccc }
そして添え字が予約語であるかどうかを心配することはありません。以下のようなことがしたいという珍しい場合には:
$array{ shift }
裸の単語でないようにさせる何かを追加することで予約語であるように強制的に解釈させることができます。
$array{ shift() }
$array{ +shift }
$array{ shift @_ }
>>592 ありがとうございます
親切にお答えいただいて
解釈の方法多すぎワロタ
仕様全部覚えようとすると圧倒的にダメな言語だなw
そこが可愛いとこでもある
当方Perlの初めて数ヶ月のPerlの玉子ですが
同じソース上で動かすと問題なく可動し
ライブラリをrequireしようとすると
入力フォームから得たUTF8が表示されなくなります。
#!/usr/local/bin/perl
require 'getformdata.pl';
use utf8;
use encoding "utf8";
use open IO => ":utf8";
use open ":std";
use Encode;
open(OUT,">text.txt");
#本来は別途のライブラリを介して値を得たい
#%formdata=plab::getformdata();
%formdata=getformdata();
#同じソース上でしか、utf8を得られない。
print "content-type: text/html;charset=UTF-8\n";
print "\n";
while (($key, $val) = each(%formdata)) {
print "$key = $val<br>";
}
close(out);
#'getformdata.pl';
sub getformdata
{
local $rawdata;
local %formdata;
local @inputs;
local ($input,$name,$val);
if($ENV{'REQUEST_METHOD'} eq "POST"){
read(STDIN,$rawdata,$ENV{'CONTENT_LENGTH'});
}
elsif($ENV{'REQUEST_METHOD'}eq "GET"){
$rawdata=$ENV{'QUERY_STRING'};
}
@inputs=split('&',$rawdata);
foreach$input (@inputs){
($name,$val)=split('=',$input);
$val=~tr/+/ /;
$val=~s/%([A-Fa-f0-9][A-Fa-f0-9])/pack("C",hex($1))/eg;
$formdata{$name}=$val;
}
return %formdata;
}
どうやったら別々のソース上でUTF8が表示できるようになるか教えてください。
>>602 少し訂正。
package宣言はすでにしている物とします。
は?CGIでいいじゃねーか
getformdata.plをrenameしてgetformdata.cgiにしましたが
実行結果は同じでした。同じソース上でサブルーチンした場合は
UTF8は表示されますが、ライブラリとして呼び出したらまるでUTF8
自体存在しなかったような挙動をとります。
use CGI
なんでuse utf8とかuse Encodeとかしてるのに全体的には10年以上前に書かれたようなコードなんだ…
KENTなんかから入って、飛び飛びにつまみぐいで勉強すると
そうなることもあるだろうね
私も少し前までそうだったよ
609 :
デフォルトの名無しさん:2010/01/07(木) 04:02:27
初めまして。文字化けについて、質問させてください。
Fedora11を使用しています。
Perl v5.10.0で, utf8でコードを書いています。
例えば、
#!/usr/bin/perl
$str = "こんにちは。";
$buffer = $str;
while ($buffer) {
$letter = substr($buffer, 0, 1, "");
$out .= $letter ."";
}
print $out . "\n";
ならば、「こんにちは。」と表示させることができるのですが、
6行目を
$out .= $letter ." ";
とすると(ダブルクォーテーションの中に半角スペースを入れると)、
ハテナ文字が18個ぐらい続いて、文字化けします。
「こ ん に ち は 。 」と表示させたかったのですが、
この場合、どうすればよいでしょうか。
use utf8プラグマを使えばスクリプトがutf8で書かれていると解釈され、
substrなどの文字列操作関数が、バイト列のどこからどこまでが1文字なのか適切に判断出来るようになる。
>>594 perl4の時の話じゃなかったっけそれ?Perl5.003でやったけど大丈夫だな。
詳しく調べてないけど、use strict subsで警告でないから問題ないんだろ。
思いつく例だと、
open(log, ">", "log.txt");
print log "hello\n";
これは問題になるわな。だかららくだ本では大文字推奨なわけだね。
まあ最近はそもそも裸のリテラルをファイルハンドルにするなって
話になってるけど。
>>599 Perl vs PHPとかだとお互い様な気がするが、Javaとかとそこを比べられると辛い。
でもPerl好きな人はそういう言語仕様のお茶目なところが堪らんかったりするんだよ。
PHPの言語仕様の揺れは、お茶目というよりは単なる嫌がらせ。
PHP好きな人はたいていそういう言語仕様のお茶目なところに泣かされている。
Perlのらくだ好きです
Perlがそこそこできるようになったので、Yahoo!の知恵袋で回答しようと思ったら全然
質問が来ないね。
やっぱ廃れた言語なんだね。
C言語はいっぱい質問が来るのに。
おまえは、注文が減ったと嘆いてる中小企業の社長かw
ネットに質問出すやつなんて、もともとはぐれメタルばっかり。
.plファイルをダブルクリックして実行するとウィンドウが出ますが
これを表示させずにバックグラウンドで実行させる方法はありますか?
0との論理和をとると何故、整数部だけが抽出できるのですか?
my $n = 123.45;
print $n | 0; #=> 123
| は logical or じゃないよ
>>614 お前がそう思うんならそうなんだろう。お前ん中ではな。
>>617 恐らくダブルクリックなら引数がつかないから、それを利用して自身を1度だけ呼び出すとか。
system("start /b cmd /c perl \"$0\" 1"),exit(0) if !@ARGV;
# バックグラウンド処理
>>620のバックグラウンド処理の奴忘れておくれ。
systemの実行が終わるのを待ってからexitするので意味がなかった。
>>617みたいな質問するやつはたぶんWindowsだろうからwperl使えと言っとく
>>558 #!/usr/bin/perl -w
use strict;
use Win32;
my $old = Win32::SetChildShowWindow(0); # 小プロセス起動時のコンソール表示無効化
my $retval_invisible = system 'dir';
# my $retval_invisible = `dir`;
Win32::MsgBox qq(system 'dir' executed: $retval_invisible);
Win32::SetChildShowWindow($old); # 復元
my $retval_visible = sytem 'dir';
# my $retval_visible = `dir`;
Win32::MsgBox qq(system 'dir' executed: $retval_visible);
__END__
625 :
デフォルトの名無しさん:2010/01/08(金) 04:29:36
夜中にすんません、perl初心者なんですが
朝から悪戦苦闘してます
どうしてもわからないので、先輩方、教えてください
下記のような二桁の数字を羅列したtxtファイル(sample.txt)があったとします
64
72
88
55
77
33
29
94
86
で、二行目の72と七行目の29をれぞれ$aと$bに代入し
そんで、仮に$aは$bより10以上多い場合はtrueを返すというスクリプトを作りたいんですが・・・
open (IN, "sample.txt");
このあとがもうわかりません!><
説明不足かも知れませんが、よろしくおながいします
ちなみに、上戸彩に似てるって言われます、Dカップの処女です
つ 除草剤
>>614 Perl使う人はリテラシー高い人が多いのでYahoo!知恵袋みたいな
情報精度の極端に低いものは使いません。
Cの質問が多いのはどう見ても学校の宿題。
629 :
デフォルトの名無しさん:2010/01/08(金) 14:36:58
いろんな日付フォーマットに合わせて整形しようとして以下のようなスクリプトを書きました。
しかし結果がうまくいきません。どこが間違っているのでしょうか?
予定:2009-September-14 08:52:12
結果:2009-September-September September
-----
$DATE_FORMAT{'hoge'} = '^([a-zA-Z]+) (\d{1,2}), (\d{4}) (\d{2}:\d{2}:\d{2}).*';
@DATE_ARRAY{'hoge'} = (2,0,1,3); # 年月日 時分秒の順番を指定
$pattern_id = 'hoge';
$date_str = 'September 14, 2009 08:52:12 PDT EST';
&date_cnv($pattern_id,$date_str);
sub date_cnv {
my($id,$date)=@_;
my(@date_array) = @DATE_ARRAY{$id};
$date =~ /$DATE_FORMAT{$id}/;
my(@factor) = ($1,$2,$3,$4);
print qq|$factor[$date_array[0]]-$factor[$date_array[1]]-$factor[$date_array[2]]|.
qq| $factor[$date_array[3]]|;
}
----
print (@factor); で確認すると、@factorには期待していた値がちゃんと入っているようなのですが・・・
@DATE_ARRAY{'hoge'} じゃハッシュのスライスだよ。
たぶん君がやりたいことは @{$DATE_ARRAY{'hoge'}}
>>630 あ、すみません。値が変ですね... [0] に 2 が入ってて、あとは空だ・・・
2行目のmy(@date_array)が期待通りいってないですね..
>>631 @{$DATE_ARRAY{'hoge'}} = (2,0,1,3);
おおおおお、こうすればうまくいきました!!
うまくいかなかった理由をもう少し勉強してみます。。。さんくす!!
use DateTime::Format::Strptime qw(strptime strftime);
my $date_str = 'September 14, 2009 08:52:12 PDT EST';
print strftime( '%Y-%B-%d %T', strptime( '%B %d, %Y %T', $date_str ) );
>>625 それは宿題だな。宿題スレへ逝け、....と言っても無いみたいだな。
Perlの宿題スレでも作ったら?
open (IN, "sample.txt");
close IN;
my($a,$b)=(72,29);
print 'true' if $a>$b+10;
sub syukudai{
my ($a,$b) = $_[2,7];
return $a>$b+10 ? 'true' : 'false';
}
sub syukudai {
open (IN, "sample.txt");
return 'ture';
}
sub syukudai {
open (IN, "sample.txt");
print 'ずっと前から先生の事が好きでした';
}
true love ですね
#!/usr/bin/perl
$x=1;
$y=43;
$g=0;
$sum=0;
while($y){
$g=length($y);
if($g==1)
{
unshift(@a,$y);
last;
}
if($g!=1)
{
$xx=10*($g-1);
unshift(@a,$y%$xx);
$y=$y/$xx;
redo;
}
}
print "@a\n";
43を一つずつ10^桁数で割ってそのあまりを入れてるんですが
43って出力されるはずなんですが、出力結果が。
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 3
となってしまうのは何故ですか?
教えてください。
>>641 最初の $y /= $xx は $xx == 10 だから $y eq "4.3" になって次の length($y) が 3 。
以降 $y を割り続け、アンダーフローして 0 になった時に $g == 1 == length($y) になって
while から抜ける。
詳しくは「浮動小数点数」でウィキペドれ。
デバッグしない人々
おっし
$y=($y-($y%$xx))/$xx;
でいけた。
bmi計算なんだが・・・何故か出力されない・・・どこがおかしい??
#BMI値の計算
$tall=165;
$weight=65;
$tall=$tall/100;
$bmi=$weight/$tall/$tall;
print "あんたのBMIは$bmi\n"
#判定
if ($bmi >= 30) {print "救えないデブだな!!\n";}
elsif ($bmi >= 25) {print "このデブが!!\n";}
elsif ($bmi >= 18) {print "普通だ!つまらないね!!\n";}
else {print "カマキリみたな体してるね!!\n";}
print "あんたのBMIは$bmi\n";
>>646 ありがとう。くだらなすぎてびっくりした
これで「なぜか出力されない」なんてことあるんかい
環境によっちゃエラーにならないってことか
後置ifと誤爆してるとかなのかな?
なるほどな
ifの前は;抜けてもエラーにならないのか
> syntax error at - line 1, near ") {"
ブロックが続くと後置でないことがバレるみたいだけど。
ふむ…何でだろ
まあ、セミコロンは見た方が良いやね
セミコロン忘れがちな俺は、エディタの強調文字列としてセミコロンを登録して
それを一番目立つ色+太字にしてるぜ
ブロックが続かないなんてことはないしな
出力されないんじゃなくて、やっぱりコンパイルが通ってない筈
654 :
デフォルトの名無しさん:2010/01/10(日) 18:13:41
ファイルから16bit Big-Endianのバイナリデータを読み出し、
16進数と符号付き10進数で表示したいのですが、
なぜか符号なし10進数として表示されてしまいます。
read(INPUTFILE,$buf,2);
$value = unpack("n", $buf );
printf("HEX : %04X¥n", $value);
printf("DEC: %d¥n", $value);
出力
HEX: FFFC
DEC: 65532
FFFCは-4なのに、符号なしと解釈されて65532になっています。
unpackで"n"としたときに、符号なしと決めうちになってしまうのでしょうか。
n An unsigned short (16-bit) in "network" (big-endian) order.
決め打ちも何もnは符号無し16ビットビッグエンディアンの指定だが
なんでnetworkって言うんだろう
>>632 よくコロンと打ち間違える俺もそうしてる:
>>657 > なんでnetworkって言うんだろう
networkを流す時のバイトオーダーをそう決めたから。
もう少しましなネーミングは無かったのか
662 :
デフォルトの名無しさん:2010/01/11(月) 12:47:32
ある既存モジュールに含まれるメソッドを書き換えたいと思い、
org_methodを次のような別名定義により書き換えをおこないました。
*old_method = \&org_method; #オリジナルに別名を割り当て
*org_method = \&my_method; #書き換えたメソッドをオリジナルの名前に割り当て
sub my_method {...}
プログラム動作は正常ですが「メソッドを再定義した」というエラーがログに残ってしまいます。
=>Subroutine Hoge::org_method redefined
呼び出し頻度の高いメソッドなので、あっという間にログが埋まってしまうありさま・・・
コードが微妙に誤っているのか・・・
このメッセージが出ないように対処することは可能でしょうか?
メソッド?サブルーチンだろ
何いってんだお前
まぁそんなことは置いといて
特に問題ないなら警告消せばいいだろ
no warnings 'redefine';
>>664 warningsも個別に制御できるんですね。ありがとうございます。
個別のテストでは警告もなかったので、どうも1回の実行のうちの複数箇所で
このモジュールが読み込まれているからだと思います。
モジュール内に直接書かない方がいいのかな・・・。
モジュールって何度も読み込まないようにできてるんじゃないの?
何度も呼ばれるサブルーチンの中で再定義してるんじゃないの?
>>665 そのモジュールはなんなんだ?
OOPで書いたのか?関数のセットとして書いたのか?
>>665 そのモジュール読むときには、useやrequire使ってるよね?
(他の方法だと1つのファイルが複数回読み込まれることがある)
>>668 requireは複数回読むことがあると思うんだが。
>>669 %INCをいじるとか、同じファイルを指すけど字面的には別なファイル名で
指定する、といったような特殊なことをしない限り2回読むことはないはず
じゃなかったっけ。
>>670 > 同じファイルを指すけど字面的には別なファイル名で
それ。1回目フルパス、2回目相対パスとか。やってみてないから分からんけど、
確かRequireはその欠点があったはず。
useもrequireみたいなもんだから同じ欠点を持ってるの?
こんなのね。
% cat hoge.pl
print "hoge!!!\n";
% perl -e 'require "hoge.pl"; require "./hoge.pl";'
hoge!!!
hoge!!!
% perl -e 'require "hoge.pl"; undef %INC; require "hoge.pl";'
hoge!!!
hoge!!!
>>672 字面が違うと複数回読む挙動が欠点と言うより、
違う字面で複数回指定してしまう設計・実装の方がマズく思えるな。
>>673 use はモジュール名での指定に限られるから、@INC 内で最初に
見つかるファイルに限定される。更にコンパイル時に読まれるから
>>674 みたくわざと %INC を改変して eval "use Foo" のように
しない限り複数回読む事は無いよ。
>>673 ないよ。文脈中じゃなくて初回に読まれるから%INC変えても意味ないし。
@INCな。
質問させてください。
簡易的なバックアップシステムを作ろうとしているのですが、そのコアの部分で悩んでいます。
以前のバックアップから変更があったファイルのみを抽出したいと思っているのですが、どのような方法がありますでしょうか?
抽出と言うのはファイル名(PATH)さえわかれば、そのファイルをコピーする作業は行えています。
現在考えているのは、バックアップを行った時点でファイル名とファイルサイズの対応表を作っておき、次回にバックアップを行うときに、その時点でのリストを作り以前のリストと比較。
その比較の結果、ファイルサイズや新たに追加されたファイルがあればコピー。
以前のリストにあり、最新のリストにないファイルは削除。
というようなことを考えています。
ですが、これだと編集後に同じ要領になったファイルが検出できないと思います。
ファイルのチェックサムを作れば、ファイル名ではなくそのチェックサムで確認が行えると思うのですが、バックアップファイルが数千や数万になることを考えると、チェックサムは現実的でない気がしています。
何か効率のいい方法や、やりかたがあればお教えいただければと思います。
どうかよろしくお願い致します。
「効率」が重要ならperlで行うような処理じゃない気がする
乱入
カレントディレクトリ配下にあるファイル名の一覧ってどうやって入手すんの?
globでやるとカレントディレクトリにあるファイル一覧しかとれん
statでctimeかmtimeでも見れてばいいんじゃない
>678
わざわざ作らず rsync を使う。
>680
一発じゃないけど File::Find 使えば?
rsyncをPerlで書いたのがあった気が。
と気になって「rsync perl」でググったら検索トップだったw
>>678 ぼくは、filenameとsizeとi-nodeとmtimeが一致したら同じと見なすという妥協をやっている。
mtimeが前回バックアップ日時より後になっているのだけで十分だと思うけど
どっちがプラスでどっちがマイナスだったか すぐ忘れる
>>678 俺もrsync推しとく。君が言ってる面倒なことは全部やってくれて、
なるべく少ない転送量で済ませてくれるから。
rsyncはどんだけ転送量を節約したか表示されるが、それを抜くのは困難だと思われ。
あとチェックサムは桁が概して小さすぎるし、文字の入れ替えで同じ結果が出たりするから、
現在はメッセージダイジェストなどを使うのが一般的。
新旧2つのログファイルがあります。
この新ログファイルでは新しく増えた行、旧ログファイルより削除された行があります。
この増えた行、削除された行を抽出したいのですが、どうすればいいでしょうか?
私が考え付いたのは、 旧ファイルを配列に読み込む。
配列より1行づつ新ファイルと比較する。
新ファイルに無ければ、削除された行。
上述の逆を行い、旧ファイルに無ければ追加された行。
というのをかんがえています。
activeperl 5.10 x64にDevel-Profilerをインストールできた人いるかな・・
CPANからDevel-Profiler-0.04.tar.gzをダウンロードしてきてreadmeのとおりにインストールしたのだけど
nmake testで
C:\bin\Perl\bin\perl.exe "-MExtUtils::Command::MM" "-e" "test_harness(0, 'blib\lib', 'blib\arch')" t/*.tt/01basic.t .......
Not a GLOB reference at C:\bin\Perl\cpan\build\Devel-Profiler-0.04-K04u79\blib\lib/Devel/Profiler.pm line 155.
INIT failed--call queue aborted.
とでて完走せず。。
ppmにはないのか?
691 :
デフォルトの名無しさん:2010/01/14(木) 00:35:49
配列があって、先頭が日付から始まる要素(A) と、そうでない要素(B)があるのですが、
A-A-A-B-B-B-A-B-B-A-B-A (要素数12)
Bがあったら、それより前のAに吸収させたいのですが、
A-A-ABBB-ABB-AB-A (要素数6)
どうやればいいでしょうか?
>>690 ppmではDevel-ProfilerでもDevel::Profilerでもそんなパッケージ見つからねえぞと言われた;;
Devel-Profiler以外のものでもactiveperlで使えるプロファイラがあれば教えてください・・
activeperlでcpanを使うのか
makeとかコンパイラは入れたの?
>>693 VisualStudio2008を入れてる。
CPANのConfig.pmでmakeはnmake使えとかいう設定を済ませてあるので
そのへんは大丈夫だと思うんだけども・・
Devel::DProfとか?
>>691 my @data = (元データ);
my ($append_to, $i);
for (@data) {
if (/^ひづけ/) {
$append_to = $i;
}
else {
$data[$append_to] .= $_;
undef $_;
}
$i++;
}
@data = grep defined, @data;
# てきとう
>>694 とりあえずStrawberryPerlでも試してみたら
>>696 それは一度環境を構築したActivePerlから乗り換えろってことを言ってんのか
結構無茶いうね
>>692 ActiveState以外のレポジトリも当たってみたのか?
>>697 原因特定のために別の環境でも試してみたらってことを言いたかったんだが…
今Linuxで試したら
>>689のエラーが出たからActivePerlのせいではないな。
forceでインストールしても実際使おうとすると同じエラーが出る。
cpanの利用が前提ならStrawberryPerlの方が都合良いし
乗り換えもぜんぜん無茶じゃないと思うがなぁ
ppm listで導入したモジュールを調べて、cpanで入れるバッチを組むだけでしょ
701 :
デフォルトの名無しさん:2010/01/14(木) 09:13:47
5.8 のときでも nmake や dmake 突っ込めば cpan shell 使えるぞと書かれてたと思う。
それはあらかじめ用意しなくてもよくなったという話じゃないのかな。
まあ、入れただけじゃコンパイル通らんけどね。
5.10はデフォで動くのか。
他人にperlを勧めるときは良いかも。
もうストロベリーパールの優位性ないでしょ
今までもMinGW入れれば良かったんだけど、より手軽になった
ppmも使えるしね
>>689 CPAN Testerを見ると5.10はみんなFAILしてるからダメなんじゃ
ActivePerl 5.8.9 + MinGW では問題なし
Perlのバージョンじゃね?
708 :
689:2010/01/14(木) 20:11:22
皆さんどうもありがとです。5.10には無理なのね・・
今日いろいろ聞いてまわったら今は後継のDevel-Profileを使うのが定石らしいです。
(昨日ぐぐりまくってたけど1字違いで検索にかからなかった・・)
こちらはppmであっさりインストール完了。
Devel-Profilerとほぼ同じ情報を提示してくれます。
ということで参考になれば。
>688
>配列より1行づつ新ファイルと比較する。
1行毎に新ファイルの全行と比較するって言ってるんだよね?
longest common subsequence と呼ばれる問題(の派生)で賢い人々がもっと効率的なアルゴリズムを考えてるから
>705 の言うとおり diff 呼び出すか diff がなければ Algorithm::Diff あたりを使えばいい。
100万行くらいあるtsvファイルが30個ぐらいあって、そのすべての行を1行ずつ取りだして、
splitし、所定のフィールドの値を関数の戻り値に置き換え、必要なフィールドだけをjoin
して別のファイルに書き出していく、という処理を書いたのですが、Core2Duo 3.16GHz/
2GB-RAMなWinXP環境でActivePerl5.8.8で実行させたところ、70分くらいかかって
しまいました。CPUパワーは平均して2/3程度占有していました。
3000万件あるのである程度は仕方ないにしても、このような処理を高速で行うために有効な
方法がなにかありますでしょうか。
711 :
デフォルトの名無しさん:2010/01/15(金) 00:22:34
perlでまとまった行を無効化するような方法はありますでしょうか?
Cでこんな感じでやるような、、
#if 0
#endif
今は
if (0) {}でやってます。
=hoge
まと
まった
行
=cut
ヒアドキュメントを思いついた俺は邪道。
714 :
デフォルトの名無しさん:2010/01/15(金) 01:31:47
715 :
デフォルトの名無しさん:2010/01/15(金) 01:52:10
多数のログファイルがあって、中からXXXXという文字の入った行を抜き出し、その先頭の日付だけを取り出したいのですが、
以下のようにやると出来たのですが、Perlのワンライナーの書き方として正しいでしょうか?
grep "XXXX" *.log | perl -ne 'if ($_ =~ /(\d\d\d\d\-\d\d\-\d\d \d\d:\d\d:\d\d)/) { print $1,"\n";}'
>>715 ワンライナーの書き方に正しいも何もないと思うけど、期待通りに動いてるならそれでいいだろ。
ただそれだと日時が行の先頭以外にあっても抜き出しちゃうけど。
grep無しで書くとこんな感じか。
perl -lne 'print $& if /XXXX/ && /^\d{4}-\d\d-\d\d \d\d:\d\d:\d\d/' *.log
ある入力が数値か確認する処理を書いたんだが、use warningsしてるせいでワーニングが出てしまうんだけど、no warnings するしかないかな。というかこれでええのか?
sub isNumeric {
$a * 1 == $a;
}
>>717 $aやめれとか引数の受け取り方がなってないというのは置いといて、
数値に見えない文字列は0扱いだから0 * 1 == 0になって、判定式
が成り立っちゃうぞ。もう少しよく考えよう。
looks_like_number関数を参考にするとか
--
aaa
$str
bbb
--
というファイルtestを作って
$str = 'xxx';
open(READR,"<test");
while(<READR>) { $buf .= $_; } close(READ);
print $buf;
を実行するとそのまま出力されるのですが、
aaa
xxx <--- ここ
bbb
と表示するようにする方法はないでしょうか?
今はテキスト置換で無理矢理やってるんですけど、いい方法があれば教えてください。
print eval '"' . $buf '"';
eval
楽だけどお勧めはしない
d
evalっぽいなと思ってたんですけど、使い方がよくわからなくてうまくいきませんでした。
>>721 えっと、最後の print $buf; 行をそれに変えてみましたがエラーになってしまうんですけど、
フォローいただけると助かります。
>>722 そうですか。普通の置換でやるのがベストでしょうか?
.が抜けてた
print eval '"' . $buf . '"';
できますた!
自己解決できなくてすみまそんw
eval で '"' なんてするとは全然思いつきませんでした。
もう少し勉強してみます
s/\$([A-Za-z_]\w*)/$str{$1}/g
>>726 d!
ちょっといじって
s/\$([A-Za-z_]\w*)/$$1/g
でいきましたー
いろんな方法があるもんですね・・・参考になりますた!
そんな罠が・・w むずかしいですね・・
730 :
717:2010/01/16(土) 03:36:10
>>718 すんません、もしもしから書いててshift入れるの忘れてました。
結局そのブロック内だけno warningsしてとりあえずは動きました。
移行スクリプトなので、現行のデータで動けばいいやと妥協しましたorz
質問
IO::Pipeで立ち上がったプロセスにシグナルを送りたいんですけど
立ち上がったプロセスのIDってどうやれば取得できますか?
----
my $pipe = IO::Pipe->new;
$pipe->reader(qw{./hoge arg1 arg2 arg3});
# 処理
my $pipe_pid = q{hogeのプロセスIDが欲しい};
kill 10, $pipe_pid;
----
pkillやpgrepだと他のhogeプロセスまで拾っちゃうし。。。
どうすればいいのか分かりません ><
732 :
731:2010/01/16(土) 06:55:28
すんません、
>>731について自己レスです。
perldoc -m IO::Pipe
でソース見たら
${*$pipe}{'io_pipe_pid'}
でとれました。
>720
その用途には大仰かもしれないが Text::Template 辺りを使うって方法もあるよ。
>>734 &jcode'convert(*company, 'euc');
すでにこれ読めない人とかいるんじゃないだろうかw
Perl6が出そうな今こそ初心に戻ってPerl4をって事ですね
>>734 for $c(split(//,$mail)){
if($c =~ /[0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\-\_\@\.]/){
} else {
$mail_error = "-";
&error;
}
}
oh...
旧石器時代のコードかよ
プログレ好きらしいので、21st Century Schizoid Codeの称号を与えたい
open FH,"id.txt";
while(<FH>)
{
chomp($user=<FH>);
last;
}
open PH,"pass.txt";
{
chomp($pass=<PH>);
last;
}
$passには値が読み込まれるんですが
なぜか$userには値が読み込まれません
誰か教えてください。
まさかとは思いますが、id.txtとは、1行しかないのではないでしょうか。
もしそうだとすれば、<FH>を2回読んでるので$userが空であることにほぼ間違いないと思います。
1行しかないならchomp($user=<FH>)
複数行ならwhile(<FH>){chomp($user=$_);}
アポストロフィはラクダ本で初めて知った
昔の書き方だって書いてあったと思う
use Acme::Don't
林先生はperlも出来るのか・・・
アポストロフィ何
ftpでレスポンスコードの530や230を取得したいんですが
while(chomp($buf=<SOCKET>))
とやるんですが、最初のログイン時のレスポンスコードが入り込んでしまい
うまく取得できません。
そこで、<SOCKET>の中身は
230----
331--password
530
となっています。
最初のwhileの繰り返しで230が入ってしまうんですが、これを230と331を読み込まず
530だけを取得するにはどうすればいいんでしょう。詳しい方教えてください。
seek(SOCKET,x,x)やsysseek(SOCKET,x,x)などで飛ばせるかと思ったんですがうまくいかず。
読んだあとに、行頭に 530 があるかパタンマッチすれば
いいんじゃないの?
>>747 読み込むとパターンマッチ処理で実行速度が遅くなるので
なるべく飛ばして処理をしたいのですが、何か方法はないですか?
streamはseek出来ないから捨てることは出来ても飛ばすことは出来ないんじゃない?
>>748 たとえば2行捨てたいなら
$null = <SOCKET>;
$null = <SOCKET>;
でできるけど?
どんだけ処理速度気にするんだよ
そもそもstatus code以下の文字列は任意長だからseekしてもね
next if / /
で目的以外を読み飛ばす処理しか思いつかん
今、next ifで飛ばしてました
while(<SOCKET>)
{
next if 1..2;
print "\n$_";
if($_=~/^230/)
{
$flg=1;
$okusr=$user;
$okpass=$pass;
last;
}
last;
}
気づかなかった。
どうもありがとうございました。
こんなんでパターンマッチ処理で実行速度が遅くなるとか
Perlさんなめすぎ
@buf = <SOCKET>;
$buf = $buf[2];
それだとメモリ使用量が増えすぎるので・・・
(undef,undef,$buf) = <SOCKET>;
Net::FTP ではだめなのかしら?
Net::FTPって1セッションしか張れないのかな?
Parallel::ForkManagerと併用するとエラーでたから、
ソースちら見したらそんな気がした。
メモリを節約する時代じゃないだろもう
オブジェクト指向ってよくわからない
base使ってたりMoose使ってたりグロブでメソッド生やしてたり、
モジュールによって実装方法がてんでばらばら
おまいらどうやって拡張したり継承したりしてますか
読むと幸せになれる本とかありますか
HTTPで複数のURL(200個くらいある)を取得するスクリプトで
LWPを使うとひとつのURLを完全に取得し終えるまで次の処理にいけないので
threadsを使ってみたんだがthreads自体が重すぎて萎えた。
複数のURLを素早く軽快に取得するにはsocket使ってガリガリ書いてくしかないのかね・・
>>763 LWP::Parallel::UserAgent
>>764 おっとこんなに早くレスもらえるとは!
そんなのあったのねありがとー
>>763 おそらく200くらいだと最速は、
AnyEvent::HTTP + Coro::AnyEvent + Coro + Coro::sephorma。
threadsは糞。
なんだsephormaって。Semaphoreの間違いな。
771 :
デフォルトの名無しさん:2010/01/21(木) 10:34:37
my $str = "123aaa456aaa789ccc012ggg";
my @ary = ($str =~ /\d+/);
print @ary[0], "\n";
とやると、1と表示されるんですが、どうして123じゃないのでしょうか?
Greedyじゃなかったんでしょうか?
パターン内に()が無いから
こうしたいんじゃないかなと予想
my @ary = $str =~ /\d+/g;
774 :
デフォルトの名無しさん:2010/01/21(木) 10:57:17
>>772 括弧があるのとないのとで動きが違ってくる理由がわかりません。。。
が、本当に違いますね。
$str =~ m/\d+/が返すのはtrue/falseだから、1はパターンマッチの結果のtrue
$strの先頭が"1"だったばかりに……
>>775 それはスカラーコンテキストの場合で、リストコンテキストのときは違うよ。
成功したときは、括弧を含むパターンなら、キャプチャーした文字列の
リスト、括弧がなければ(1)
失敗したときは空リスト
なので、今回の場合は括弧がないから(1)になった。
こうしてPerler予備軍がまたひとり去っていくのであった・・
perl mongerじゃなくてperlerなのか
Perl者
#リストコンテキストの場合
/\d+/ : (1) #真。失敗時は ()
/(\d+)/ : ('123') #最初にマッチした部分の$1〜$9
/\d+/g : ('123', '456', '789', '012') #全ての$&
/(\d+)/g : ('123', '456', '789', '012') #全ての$1〜$9
#スカラーコンテキストの場合、マッチ成功時は 1 、失敗時は ''
scalar /\d+/ scalar /(\d+)/ scalar /\d+/g scalar /(\d+)/g
あと、誰か@ary[0]にも突っ込んでやれよ
むしろ@ary[0]でもきちんと動くことに驚いた
Perlのバージョンによるのかな
@ary[0]は配列スライスになるから問題ない。
なるほど右辺値にある場合はどっちも同じように動くのか
785 :
デフォルトの名無しさん:2010/01/21(木) 15:01:09
@ary[0]じゃなくて、$ary[0]と書かないといけないのはわかりました。
コンテキストとかよくわからないし、、、
Perlってなにか奥が深いですね
こうしてPerler予備軍がまたひとりPythonスレへと巣立っていくのであった・・
>>785 初心者はあまり気にしなくてもいいところ。
>>785 > Perlってなにか奥が深いですね
「奥が深い症候群」でググっておいたほうがいい。
厨臭い造語をググってもたいして実りは無い。
そのスレッドに色々な代替が載ってるな
WWW::Curl::Multi
Parallel::Forkmanager
Mojo::Client + Mojo::Trunsaction
IO::Lambda
多すぎ
>>788 俺も見るからに厨臭いと感じたがググってみたら
発信してるのがその著書にお世話になったこともある有名人で驚いたw
793 :
デフォルトの名無しさん:2010/01/22(金) 14:14:37
open(FH, "file.txt");
と書いたときFHというのは何になるのですか?
変数でも配列でもハッシュでもないし。
ファイルハンドルになる
795 :
デフォルトの名無しさん:2010/01/22(金) 17:18:50
ファイルハンドルというのは、$がついててもいいし、ついてなくてもいいんですね。
は?何を言っているのか分からない
インターナルサーバーエラーで、苦しんでいる。
apach2+activeperlの最新。
環境はwinxp home
コマンドプロンプトではperl helloworld.plで正しく出力できるが、cgiとして動かすとインターナルサーバーエラー。
パスにはスペースを含めていないし、
うーん。
ヒントをお願いします。
どうせhttpheaderを出力してないんだろ
>>799-801 >インターナルサーバーエラーで、苦しんでいる。
Webプログラミングの話はWebプログラミング板へ
>>797 生ファイルハンドルつか型グロブなんか
もう使う気にはならんよ。
人のソース見てたらなんか sub hoge : fuga (){} みたいな記述を見つけました。
なんぞこの fuga
806 :
デフォルトの名無しさん:2010/01/23(土) 00:01:57
807 :
デフォルトの名無しさん:2010/01/23(土) 12:43:22
関数から配列を返したいときは、グローバルで返さないと駄目ですか?
例えば、
sub function() {
my @array;
return \@array;
}
とかやったら駄目ですか?
そゆときは呼び出し元で配列作って参照渡しする
809 :
デフォルトの名無しさん:2010/01/23(土) 13:35:04
なるほど。ありがとうございました。
>>807 やってもいいよ。というか、複数の配列を返すなら基本的にそうするしかない
一つの配列を返すだけなら return @array; でもいい
808の言うように参照渡しするという手もあるけど、俺にはメリットがよくわからない
811 :
デフォルトの名無しさん:2010/01/23(土) 15:11:58
>>806 コード部分をtest.pmというファイルに書き込んで試してみたけど
DEMOLISHは普通に呼ばれてるようだが?
% perl -e 'use test; $x=test->new'
test string
fuga fuga
これで不満ならもう少し説明してもらわないとなんとも。
あとついでだが全て小文字のモジュール名はプラグマ用なので
避けた方がいいよ。
本当にコピーが起きるのか
>>807 大丈夫だよ。リファレンスカウントってのがあってスコープ抜けても値は保持される。
リファレンス返すのも良いし呼び出し時にfunction([1,2])みたいにリファレンスを渡す
方法も結構使われてると思う。
デバッガ(perl -d)の使いかたがよくわかりません。
/usr/lib/perl5/vendor_perl/5.10/Net/HTTP/Methods.pm 内の
sub http_configure にブレークポイントを設定する場合はどうやったらいいの?
>>812 しかし副作用って嫌いなんだよな
他人の書いたソースに
sub hoge{
my($str, $opt) = @_;
$opt->{fuga} ||= 'hogefuga';
~~~
}
のような処理があって$opt->{fuga}が自動生成されたためにバグが起きたことがあったんだが、
それ以来副作用の起こる関数はトラウマだ
それ考えたらちょっと遅くなるほうが断然マシだ
use strict 'refs';
819 :
デフォルトの名無しさん:2010/01/24(日) 12:17:35
perl, v5.10.0 built for i386-linux-thread-multi
を使っています。
ターミナルの文字コードもプログラムも utf-8 を使用しています。
以下のプログラムでは、文字のエンコードとデコードがうまくいくときといかないときがあるのですが、どうしてしょうか。
また、その解決のためにはどうすればいいでしょうか。
#!/usr/bin/perl
use utf8;
use Encode;
use Encode::Guess qw/euc-jp shiftjis 7bit-jis/;
my $original_string = $ARGV[0];
my $internal_string = decode('Guess', $original_string);
my $utf8_string = encode('utf8', $internal_string);
print $utf8_string . "\n";
exit;
~
で、
$ ./encodeco_test.pl あ
だと、
あ
を返して成功するのですが、
$ ./encodeco_test.pl に
だと、
shiftjis or utf8 at /usr/lib/perl5/5.10.0/i386-linux-thread-multi/Encode.pm line 162
と返って、うまくいきません。
どうすればうまくいく「に」と返ってくるでしょうか。
Guessを使わない
>>819 エンコーディングの自動判別ってのはそういうもんだよ
必ず正確に判別できるわけじゃないから、できれば使わないほうがいいし
使うのなら失敗した時にどうするか考える必要がある
Guessを使うやつは何考えてんだろ
候補が複数あるときは、両方でデコードしてみて
結果のバイト数が少ないほうを採用すると大抵はうまくいく。大抵は。
>>822 ウェブ拍手のような、送信元の文字コードが不定になる
レンタルサービスを作るなら欲しくなるときもあるんじゃない。
FORMのaccept-charset(は通じないブラウザがある)か、インラインフレームで対処可能だけど。
・・・板違いか。
guessをdetectorのような使い方するのが問題なんだよね。
その文字コードの定義範囲に収まっているものだけに絞るといった点
では完璧な動作するのに(jis系は除く)。
JIS,EUC,半角カナなしのSJISぐらいを考えれば良かった昔はだいたい
判別できたんだけど、utf8が入ってきた時点で区別のつかないパターンが
増えてどうにもならなくなったよな。
827 :
デフォルトの名無しさん:2010/01/25(月) 03:25:57
820-826のみなさん、回答ありがとうございます。
エンコーディングの自動判別とはそういうものなのですね。
できれば使わない方がよく、使う場合は、失敗時の対応を用意すると。
また、utf8が入った段階で区別がつきにくくなった、という歴史的な経緯もあるとのこと。
勉強になりました。
>>824 いろいろなヒントをありがとうございます。
試してみます。
jcode.plだと、一番マッチしたバイト数の多い文字コードを返すようにしてたな。
utf8がないからjcode.plは精度が良かった
今はすべてutf8に統一すればいいだけなんで楽になったな
統一できるならな・・・
そうもいかない場合も時としてあって、そのときどうしようねって感じ
utf8はロジックで比較的簡単に判別出来るでしょ。
sjis、euc、jisの他に8859-1を加えた中から判別とかになるとguessじゃ絶望的だけど。
Win32::OLE で質問です。
Excel1 の特定セルの値を配列に保持し、Excel2 の特定セルに書き、
Excel3で別名保存と処理がしたいのですが、別名保存ができません。
my $Excel = Win32::OLE->GetActiveObject('Excel.Application')
|| Win32::OLE->new('Excel.Application', 'Quit');
# 読込むエクセルオープン
my $ReadBook = $Excel->Workbooks->Open("C:\\Excel1.xls");
my $ReadSheet = $ReadBook ->Worksheets('Sheer1');
# セルの内容を配列にする処理。読込んだらClose
$ReadBook->Close();
# 書込むエクセルオープン
my $WriteBook = $Excel->Workbooks->Open("C:\\Excel2.xls");
my $WriteSheet = $WriteBook->Worksheets('Sheer1');
# 配列の内容をセルに書込む処理。書込んだら保存
$WriteBook->SaveAs("C:\\Excel3.xls") or die "保存失敗";
$WriteBook->Close();
$Excel->quit() ;
申し訳無いのですが、どなたかお心当たりありましたらご教授お願いします。
>>833 そのコードで試してみたけどエラーが出なかった。
dieのところで Win32::OLE->LastError() を調べてみてはいかが。
>>834 ありがとうございます。LastError()やってみました。
エラーコード:0x8002000E
無効なパラメーター数です。と出ました。
引数の数が合ってないのかな。
ネットのサンプルやActivePerlのサンプル見ても引数1つだし、分からんです・・・。
リファレンス何処かにありませんか?
VBAを使うのだあ
かなり大きな行列計算をしたいのですがperl.exe.stackdumpと出て強制終了してしまいます
これはメモリが足りないということでしょうか
バグじゃない?
839 :
835:2010/01/28(木) 23:18:21
>>836 使いたいですよ・・・。でもなんでか知らないんですがPerlの案件なんです。
自己解決というか、なんでか分からないけど回避できました。
$WriteBook->SaveAs("C:\\Excel3.xls") or die "保存失敗";
ではなく、
$WriteSheet->SaveAs("C:\\Excel3.xls") or die "保存失敗";
にしたら保存できました。何でだよ・・・。意味が分からん・・・。
>>837 超長い文字列に正規表現適用したら起こるって記事見たことあるな
JSON.pm でスクリプトタグなんかをサニタイズしたいんですが、メソッドが見つかりません
普通はどういう方法でやるものなのでしょうか
シリアライズした後に置換すれば問題ないでしょうか
HTML::Entities使えば?
>>842 申し訳ないですがその解決策は HTML::Parser に依存しているようなので却下で。。。
できればあまりCで書かれたライブラリに依存せずに実装したいです
「普通はどういう方法でやるものなのでしょうか」って聞いておきながら
HTML::Parser使ってるのは駄目って後出し条件言うなよw
そもそもJSON.pmとタグのサニタイズの関係性がわからないんだけど
なんでJSON.pmにそんなメソッドがついてると思ったの?
>>844 その通りですね、すみませんでした
そういったことをしたい場合はHTML::Entityを使うというのが普通なのですね
ありがとうございます
サニタイズについては、JSONで通信をする場合に不適切なコンテントタイプによって
スクリプトタグを通されてしまう可能性があるという記事を見つけまして、
サーバー側でサニタイズしてしまえばブラウザ間の差異も考えずに済むし楽なのではないかと思いました
そしてそういう欲求は多くの人が持っているのではないかと考えました
JSON.pm を見ても / やら ascii 文字以外やらをエスケープするメソッドはあったので、
簡単な手法で < や > などもエスケープすることができるのではないかと思いました
>>845 ラッパーモジュールを作ってセッターで置換することにしました
お手数お掛けしました
そんなの上のレイヤーの話でJSON関係ないだろ。
なんでも一カ所にぶち込むなや
print "\u\Labc\n";
print "\L\uabc\n";
どっちも「Abc」となるのだけど、なぜだろう?
\Lは単独では意味ないぞ
どっちも\Lが無視されるから同じ文字列になる
print "\u\LABC\n";
print "\L\uABC\n";
えっと、これでも両方「Abc」になるんだけど、なぜだろう?
bとcが小文字に変換されているので\Lは動いていると思うのだけど
どうも理解が出来ず。
\E を覚えずに \L 使ってると理解しにくいと思う。
ていうか \u\Labc\n なら大文字にされるべきは \L だろう、という理屈か。
全く理解できず(´・ω・`)
print "\u\LABC\E\n";
print "\L\uABC\E\n";
\Eを入れても動作変わらない。
前者は\Lでabcになってその後\uでAbcになると思っていて
後者は\uでABC(何も変わらない)になってその後\Lでabcになると思ってるんだが
そうならない。
順番じゃなくて強度の問題だから。
範囲指定と1文字指定がかぶってるところは1文字指定の効果が優先される。
perlの本スレは(あるのかどうか分らんけど)どこでしょう?
無い、あるいはここ
perl6のスレはWEBプログラミング板にある
>>854 実験するとそんな感じなんだけどマニュアルのどこかで説明されてる?
perlopのQuote and Quote-like Operatorsのあたりかなと思ったけど
その辺は明記されてないし。
ありがd。
優先順位みたいなのがあるのね、なんとなく理屈は分かった。
ラクダ読んだ感じだとそういう記載は見当たらなかったけど
perlのソースでも読めば書いてあるんかな。
そりゃソースに書いた通りに動いてるんだから当たり前だろ
860 :
デフォルトの名無しさん:2010/02/02(火) 12:37:01
スレチだったらごめん。
MT4 のプラグイン周りの本で、「プラグイン開発入門(関根元和著)」より詳しい本ってありますか。
この本はほとんど理解できたんだけど(実践した)、もうちょっと細かいところを知りたいんですが。
MT 自体がもう落ち目なのかもしれないけど。。
862 :
854:2010/02/03(水) 14:33:33
>>857 ラクダかリャマで読んだ記憶が・・と今見返してみたらリャマに載ってた。
初めてのPerl第3版P148〜149とその脚注参照。
マニュアルは全部目通してないからわからない。。
863 :
デフォルトの名無しさん:2010/02/04(木) 00:52:06
優勝賞金500万円
http://www.jaist.ac.jp/ICGA-events-2010/olympiad/ 1989年にロンドンで第1回目のコンピュータオリンピアードが開催されました。
毎年開催される本イベントでは,コンピュータゲームプレイヤー同士が競技し,世界最高位を決定します。
これまでの優勝者には,Neurogammon(バックギャモン, 1989年), Chinook (チェッカー, 1989年および1990年) そして Tacos(将棋, 2005年, 2006年, 2008年, 2009年)などがあります。
コンピュータオリンピアードは国際コンピュータゲーム協会(ICGA)が主催して実施されています。
競技部門には,アマゾン,バックギャモン,ブリッジ,コンピュータプール,六目並べ,象棋,ドッツアンドボックス,国際ドローツ,囲碁,9路盤囲碁,ヘックス,ハバナ,ラインズオブアクション,
将棋,スラカルタなどがあります。
この他のゲームもコンピュータによる競技会を開催する可能性があります。主催者までコンタクトしてください。
2010年に第15回目となるコンピュータオリンピアードは金沢市内で開催されます。
ICGAとJAISTとの共同イベントとして9月25日から10月2日にかけて金沢市内で開催されます。
各競技の日程は後日決定します。
参加申し込みなどの詳細も後日お知らせ致します。
perlもutf8、SQLもutf8
これで2バイト文字使うと取り出した際に必ず文字化けする
どーすればいいんだ
かれこれ7時間悩んでる
UTF-8の2バイト文字…?
とりあえず、mysql_enable_utf8オプションをつければPerl側からフラグ付きUTF-8を受け渡しできるはずだが
>>865 ありがとう!!!!!!!!!!!!!
sqliteだったからフラグで検索して
$dbh -> {unicode} =1
で解決したぁぁ
ほんとありがと!
あとこれ使わない時は
$text = Encode::decode('utf8', $text);
とすればよかったのか
pythonがいいよ
文字で何も悩まなくて済む
rubyでいいじゃん。
多分。
perlの次にマスターするのは、rubyかpythonのどっちかだな
それぞれに特徴があるけど、どっちでもだいたいおんなじ
スクリプト言語はperlだけで充分。
perlの次はC/C++かjavaだろjk
結局Perlに戻ってくるんだよね
環境によって学ぶものは人それぞれだろ
一概にこれがいいって議論は不毛だし、ここでは必要ない
またモジュールをいちいち探して使い方を調べる作業は不毛だし
いや自分で作るからって人にはどのスクリプト言語使おうが同じだし
最初に覚えたスクリプト言語を使い続けるのが普通だと思うけど
外的要因で他も使わざるを得ない人はほんとに気の毒だね。
日本マンセーならRuby一択
876 :
デフォルトの名無しさん:2010/02/08(月) 12:33:22
blessしたオブジェクトが途中までは使えるんですが、いつの間にかHASHに
戻ってメソッドが呼べなくなるバグに悩まされています。
ためしに
sub DESTROY {
my ($obj) = @_;
print $obj->{"Name"}, " was destroyed.\n";
}
て感じで書いてみたら見事にオブジェクトが壊されていました。
このDESTORYがいつ、どこで、どうして呼ばれるのか
知る方法は無いでしょうか?
DESTROYのなかでcluck使ってバックトレース出してみれば?
Devel::Trace
・・・と書こうと思ったけど877の方がいいな
879 :
デフォルトの名無しさん:2010/02/08(月) 13:28:15
参考書に
「ローカル変数を宣言する場合はmy関数を使用するのが望ましいが、
配列や連想配列をmy関数によってローカル化できない為にそういった場合にはlocal関数を使用する」
と書いてあるのですが、参考サイトを見てみるとそういったことは書いてありません。
本当にlocal関数でしか配列はローカル化できないのでしょうか?
my関数の方が完全にローカル化出来るので、できればmy関数を使用したいのです。
myをローカル化なんて説明している本は捨てた方がいいんじゃね?
ちなみになんていう本よ?
881 :
デフォルトの名無しさん:2010/02/08(月) 14:31:08
秀和システムのPoket詳解Perl/CGI辞典です。
882 :
876:2010/02/08(月) 14:41:35
>>877をやってみました。
at c:/xampp/htdocs/test//Foo.pm line 224 ←&cluck()を書いた行
Foo::DESTROY('Foo=HASH(0x........)') called at ./baa.pl line 0
eval {...} called at ./baa.pl line 0
at c:/xampp/htdocs/test//Foo.pm line 224
Foo::DESTROY('Foo=HASH(0x........)') called at ./baa.pl line 0
eval {...} called at ./baa.pl line 0
at c:/xampp/htdocs/test//Foo.pm line 224
Foo::DESTROY('Foo=HASH(0x........)') called at ./baa.pl line 0
eval {...} called at ./baa.pl line 0
…
て感じで続きます(オブジェクトの配列です)。正直line 0 とか意味が分かりません。
分かる方お教え下さい。
でもその前の配列のsortに使う関数の中で、Use of uninitialized value in 〜 が
頻発しているので、この時にすでにオブジェクトが壊れているのかなとも思います。
これ以上なにかヒントありますでしょうか?
>>882 運が良いときはeval {...} called at 〜 が解放の起きた付近を示していることも
あるんだけど、line 0じゃ手がかりないねぇ。
878が紹介してたDevel::Trace使ってみれば?
>>879 確かなことは言えないが、もしかすると書籍の引用の前後の文脈では
配列の「要素」について説明してるんじゃないか?
myは変数に対して宣言するわけだから、つまり↓のようなことを言ってるのでは。
×my $foo{'bar'}
○local $foo{'bar'}
もしそうだとしても、配列の要素1個だけlocalにするような
プログラムってどうよ?
とんち染みてきたなw
887 :
デフォルトの名無しさん:2010/02/08(月) 20:55:29
>>884 すいません「要素ローカルにできない」とちゃんと書いてありました。
自分の目が節穴だったためにお手数をお掛けして申し訳ありませんでした。
local $SIG{ALRM} = sub {};
こういう使い方以外に思い浮かばない
889 :
876:2010/02/10(水) 13:18:17
WEBプログラミング板に移動したのでこちらは締め切ります。
お前ら使えねえな。
>>889 お力になれず申し訳ありませんでしたm(_ _)m
>>889 自分の程度の低さを棚に上げて最低な奴だな
死ね
Windows の ActivePerl を使っています。
Win32::OLE->new で、iTunes を起動するスクリプトを書いて、
それはうまくいっています。
iTunesが動いていないときも、new を実行すると iTunes を起動してくれるのですが、
少しありがた迷惑なので、iTunes が起動していないときには、
何もせず終了するようにしたいのです。
どういうオプションを渡せばよいでしょうか?
iTunesが起動していないときだけ起動する、というのではないの?
それとも勝手に起動されると迷惑だから、起動している時だけ、スクリプトを実行させたいのかな。
newの前に、
return 0 if !Win32::OLE->GetActiveObject('iTunes.Application');
とかやるのはどう?
サーバー上で
perl からphpファイルを実行するのはどうすればいいでしょうか
$ans = `php -f post.php`;
print $ans;
print system("/usr/local/bin/php -f /virtual/user/public_html/post.php");
my $PHP = '/usr/local/bin/php';
my $PHP_FILE='/virtual/user/public_html/post.php';
open FH, "$PHP -f $PHP_FILE|";
while (my $x = <FH>) {
print "$x\n";
}
close FH;
この3つ試したんですがphpのソースが表示されてしまいます
サーバーはcoreserverです
896 :
893:2010/02/11(木) 14:42:05
>>894 ありがとうございます。後者の方です。
サンプル試してみます。
>>894 > Win32::OLE->GetActiveObject('iTunes.Application');
は、iTunes が起動していても、起動していなくても、
取得に失敗してしまい、判別に使えませんでした。
>>899 すみません
Webプログラム板にいってきます
>>898 psのwin移植版かwin標準で入っている(かもしれない)tasklist.exeを呼び出せばよいのでは?
`ps` =~ m/iTunes/i とか `tasklist` =~ m/iTunes\.exe/i あたり。
>>901 perl だけでなんとかしたかったのですが、tasklist をつかってごまかすことにします。
ありがとうございました。
903 :
デフォルトの名無しさん:2010/02/11(木) 18:42:17
何でもアリなのがいいな、Perl
904 :
デフォルトの名無しさん:2010/02/12(金) 09:18:24
Matts::Message::Parserの使い方について
わかる人教えてください。
eメール形式のファイルから本文や添付ファイル等を取り出したいのですが、
利用しているレンタルサーバー(webarena)の契約では
MIME::ParserやMIME-toolsがなく、できるだけ
依存関係が少ないパッケージモジュールを検索していましたら
Matts::Message::Parser
http://search.cpan.org/~msergeant/Matts-Message-Parser-1.0/lib/Matts/Message/Parser.pm にたどり着きました。
Message.pmと
Parser.pm(use Matts::Message;をrequire './Message.pm'に変更)
で何とか動きました。
require './Parser.pm';
open(my $fh, "foo.eml");
my $msg = Matts::Message::Parser->parse($fh);
my $msg_size=$msg->size; #メッセージサイズ
my $msg_enc=$msg->body_enc; #エンコードタイプ
my $msg_id=$msg->header('message-id'); #メッセージID
my $msg_time=$msg->header('date'); #受信時間
my $msg_subject=$msg->header('subject'); #件名
と取得できたのですが肝心の本文(body?)と
添付ファイル(attachment?)の取得ができません。
$msg_body=$msg->body()?
$msg_body=$msg->bodies?
とかしたんですけど型グロブ?がなんたらでよく
わかりませんでした。
どなたか助け舟をお願いします。
よくわからないけど、ソースを見た感じだと
$msg_body=$msg->parse_body;
とかじゃないの?
Matts::Message::add_body_part() を見るとパースが終わった後のファイルハンドルをそのまま突っ込んでるな。
$msg->bodies は Content-Type とファイルハンドルが組になったリストを返すし、
$msg->body はファイルハンドルを返す。
どおりでサンプルはcloseしてないわけだ。
だから、body を読みたければ例えばこうする。
my $bodyfh = $msg->body;
my $body = join '', <$bodyfh>;
こんなもんでいい?
あと、pure-perlなモジュールをインストールせずに手元で動かしたければ
libフォルダを丸々コピーして
use strict;
use warnings;
use lib(qw{ ./lib });
use Matts::Message::Parser; # require がいいならそれでも桶
すればいいよ。
908 :
デフォルトの名無しさん:2010/02/12(金) 20:43:08
>>906 >>907 ありがとうございます。
use Encode;
use MIME::QuotedPrint;
my $msg_size=$msg->size; #メッセージサイズ
my $msg_enc=$msg->body_enc; #エンコードタイプ
my $msg_id=$msg->header('message-id'); #メッセージID
my $msg_time=$msg->header('date'); #受信時間
my $msg_subject=$msg->header('subject'); #件名
my $msg_cenc=$msg->header('Content-Transfer-Encoding'); #Content-Transfer-Encoding
my $bodyfh = $msg->body;
my $msg_body = join '', <$bodyfh>;
$msg_body=encode(lc($msg_enc),$msg_body); #エンコード
if (lc($msg_cenc)=~ /quoted-printable/){
$msg_body=decode_qp($msg_body); #quoted-printableの場合
}
としてみたらうまく取得できました。
添付ファイルもわかったら解読していただけませんでしょうか?
私には暗号にしか見えませんので。。
悪いが俺はそこまで付き合う気は無い。
>Don't use in your own projects, unless you are willing to figure out the API
yourself.
(てめえが API を自分で見つけ出す気がないなら、てめえのプロジェクトで使ってくれるなよ)
とあるしな。
他のお暇な方どうぞ。
横からなんだけど figure out って「分かる/理解する」だよ
うん、どっちかって言うと、「嫌なら使うな」ってニュアンスだね。
912 :
デフォルトの名無しさん:2010/02/13(土) 02:36:58
centos5.4 X64環境にてcpan2rpmでDBIx::Classをインストールしようとすると
途中で固まっちゃうのだが、なんか手立てはないかな?
Tarball extraction: [/usr/src/redhat/SOURCES/DBIx-Class-0.08118.tar.gz]
が出て固まる。
ソースからコンパイルしてインストールすればいいのだろうけど。
use strict使うとファイル単位で宣言を検査するから
グローバル変数として用意した設定値が困る
外部ファイルでrequireしてもエラーだし
useでもそうだけど$package:hoge
みたいに書かないといけないから見た目がださいよね
数が多いからファイル毎に空の宣言並べるのも馬鹿みたいだし
なんかこうC言語のincludeみたいにコンパイル前にソースに結合するとか
綺麗なやり方はないのかな?
使い方としては別ファイルに固定定数を並べといて
実行時には$hogeみたいに変数名だけでアクセス出来るようにしたくて
かつuseやrequireみたいな一文を冒頭に追加するだけでいいみたいな
>>914 Exportってそういう使い方も出来るのか
でもまだ効率悪いな
qwで変数名書いて、定義して、値を代入する
の3個書かないといけないんだな
CGIだから無駄にソース膨らめばその分遅くなるんだがな
CGIで遅いとかw そんなに遅くて困るんならmod_perlなりfastcgiに
行くべきで、そんなところで頑張るのは無駄。
\begin{align}から\end{align}までの間の行を抜き出したいのですが,どうすればよいですか?
↓の例だと3行を抜き出したいです.
hogehoge
\begin{align}
a=b\\
c=d\\
e=f
\end{align}
hogehoge
教えてください.
918 :
917:2010/02/13(土) 22:00:31
917です.
print ifを使わずに,中身を変数に格納したいです.
よろしくお願いします.
printでできるんなら、printを$s .= $_に置き換えればいいだけだと思うが。
>919
ありがとうございます.
>920
分かりにくくてすんません.
print if /\\begin{align}/../\\end{align}/;
でprintならできるけど...という意味でした.
919氏が答えを言ってんじゃん。
$s .= $_ if /\\begin{align}/../\\end{align}/;
とか、
if( /\\begin{align}/../\\end{align}/){
$s .= $_ ;
}
で好きな様に料理すれば良かろ?
って良く読まずに書きこんじゃった。
ドンマイ
ここでいいのか分からんのだけど
perlエンジン自体をローカルアプリで利用したい場合は
別途perlをインストールしてshellで呼ぶのが一般的なんだろうけど
アプリ自体に組み込んで利用出来るライブラリとかはあるんでしょうか?
mod_perlみたいな
mod_perlはライセンスの関係で他のアプリに組み込んで配布していいのか良く分からんし
アプリを配布するのにperlを別途インストールしてねなんてやりたくないし
なんかいい方法ありますかね?
> アプリを配布するのにperlを別途インストールしてねなんてやりたくないし
こういう用途ならpp (Perl Packager) 、perlcc、perl2exeとかがあるよ。
どれも不完全だったり入手困難だったり
$hoge=print'value="$x"';
$x=100;print $hoge; #value="100"
という結果が欲しいのですが
$hoge = print("value=\"".$x.\""); や
$hoge = print qq{value="$x"};
とやってもダメでした・・・何か方法が有れば教えて頂けないでしょうか。
my $hoge = sub { qq{value="$_[0]"} };
my $x = 100;
print $hoge->($x);
↓だとpiyoを出力した上でその成否(成功なら1)を$hogeに代入する、という意味にしかならない。
$hoge = print "piyo";
$hoge = 'print "value=\"$x\"";';
$x = 10;
eval $hoge;
>>931-932様
おかげさまでうまく廻すことが出来ました!
成否判断やeval関数のご指摘、とても勉強になりました。
有り難うございます。また精進してきます
use HTML::AA;
my $aart = new HTML::AA;
$aart -> code('sjis');
を宣言して、
$dot = $aart -> shorter(@a);
とするとパニック起こして動きません。
@aはpushによって動的に作成された配列です。
リストで @a = (1,2,3); のように作成した配列なら正常に通ります。
原因わかる方いらっしゃいますか?
最初のコード宣言をeucにすると通りますが、出来上がりの表示が崩れてダメでした。
配列に放り込む時に文字コードを変換してみましたがそれでもダメでした。
俺たちはエスパーじゃないので
俺現役エスパーなんだけどわかりません
>>934 少なくともうちの環境ではpushだろうが正常に通るので、
パニックだし環境依存の問題じゃね-の?
>>936 だって君の能力は透明化じゃないか
肝心なときだけ見られてるけど
940 :
934:2010/02/16(火) 17:03:32
一応ソースはってみます。おかしいところはないはずですが・・・・
#!/usr/bin/perl
use HTML::AA;
my $aart = new HTML::AA;
$aart -> code('sjis');
@TeamRanking = ('順位'); @TeamScore = ('スコア ');
for(0..150){
push @TeamRanking, $_;
push @TeamScore, int(rand(1000000));
}
$dot_R = $aart -> shorter(@TeamRanking);
$dot_S = $aart -> shorter(@TeamScore);
@TeamRanking_c = ();
@TeamScore_c = ();
foreach (@TeamRanking){ push @TeamRanking_c,$aart -> adjust('', $_, 'R', $dot_R); }
foreach (@TeamScore){ push @TeamScore_c,$aart -> adjust('', $_, 'L', $dot_S); }
$txt_team = "成績\n";
for(0..$#TeamRanking){
$txt_team .= "|$TeamRanking_c[$_] $TeamScore_c[$_]\n";
}
open DATA,"> ranking.txt";
print DATA $txt_team;
close DATA;
sub shorter_sjis {
my $self = shift;
my @array = @_;
my $fit = 0;
foreach my $buf (@array) {
my $set = $self -> calcu_sjis($buf);
next if $fit >= $set;
$fit = $set;
}
while (1) {
my $flag = 0;
foreach my $set (@array) {
my $temp = $self -> adjust_right_sjis($set,q{},$fit);
my $temp2 = $self -> calcu_sjis($temp);
next if $fit == $temp2;
$flag = 1;
$fit ++;
last;
}
last unless $flag;
}
return $fit;
}
なにこのwhileふざけてるの?
>>940 無限ループなのかどうかはわからないけど、
CPU100%に張り付いたままいつまで待っても
終わらんね。
最初のshorterの呼び出しの
$dot_R = $aart -> shorter(@TeamRanking);
が帰ってこない。
use strict;
use HTML::AA;
my $aart = new HTML::AA;
$aart->code('sjis');
my @x = qw(foo 1 10);
$aart->shorter(@x);
ぐらいで再現するから作者にバグレポしてみれば?
utf8が入る以前の遺物なのかなぁ。今ならsjisとeucで同じような
関数を並べて書くなんて無駄なことしないでutf8決めうちで最後
の出力の時に変換してねでいいと思う。
2006年にプロトタイプをファーストリリース。
対して Encode.pm が標準モジュールになったのは、
2002年の perl5.8 から
作った奴の脳が旧時代だったんだろうな
eucなら動くんなら、配列にsjisだとメタ文字を含む日本語が使われてるんじゃ?
>>934 文字列の"0"を数値とみなしちゃって起きるバグだと思う
HTML/AA.pm の271行目の
270 my @array;
271 while($str) {
272 $str =~ s/(.)//;
を
270 my @array;
271 while($str ne '') {
272 $str =~ s/(.)//;
って直したら自分のところではうまくいった
948 :
934:2010/02/17(水) 11:40:11
>>947 こちらでもうまくいきました。エスパー様ありがとう。
その他協力いただいた方もありがとうございました。
ちゃんと作者にフィードバックしとけよ
934のように最低限の訊き方、礼儀をわきまえた奴がゆとり新人にいないのは
仕様ですか?
>>950 仕様。それをできるように仕込むのがおまえの仕事。
952 :
デフォルトの名無しさん:2010/02/17(水) 16:46:41
★自分のサイトのperlスクリプト場所
www.samohan.jp/cgi-bin/form.cgi
★買い物カゴシステムのPOST送信先(買物カゴ中身画面のアドレスと同じ)
https://www.jacky.jp/cgi/kago.cgi?user=samohan とします。
htmlやphpのFORMで買い物カゴシステムへPOSTせずにform.cgiでPOSTデータをkago.cgiへ送信し、送信したらkago.cgiが表示する買物カゴ中身画面へと移動させたいです。
買物カゴシステムを乗り換えるときカンタン移行できるよう、ワンクッションかませたいとおもっているのです。
今はform.cgiでフォームを表示して「送信」ボタンを押してもらい、kago.cgiへPOSTしているのですが、押さずに済ませたいのです。
★form.cgi内のpost送信ソース
my $url = '
https://www.jacky.jp/cgi/kago.cgi?user=samohan';
use LWP::UserAgent;
use
HTTP::Request::Common qw(POST);
my %formdata = ('user' => 'samohan', 'item' => $item, 'price' => $price, 'kazu' => $kazu);
my $request = POST($url, [%formdata]);
my $ua = LWP::UserAgent->new;
my $res = $ua->request( $request);
print $res->as_string;
としてみました。
しかし
★結果(www.samohan.jp/cgi-bin/form.cgiの結果表示画面)
Found
The document has moved here.
となります。
'here'はリンクとなっており、リンク内容は'
http://www.samohan.jp/cgi-bin/kago.cgi?user=samohan'となっています、どうしていいのかわかりません、がんばりが足りないのでしょうか。
953 :
デフォルトの名無しさん:2010/02/17(水) 16:49:56
すみません、post送信ソースの最後はprint $res->as_string;ではなくprint $res->content;にしています・・・。
インターネットの質問コーナーは、どれもこれもいずれ礼儀に関する説教に
埋め尽くされる状態に至る。
こんばんは。ハッシュの渡し方について質問です。
&follow_form ( key1 => 'hoge', key2 => 'foo', key3 => 'bar'......);
(keyとvalueの名前と要素数は可変)といった関数を作成したいのですが、
submit_form内のfieldsへのデータの渡し方が分かりません。
何卒お願い致します。
-----------------
my $mech = WWW::Mechanize->new();
sub follow_form {
my %item_list = @_;
#ここでなんらかの処理?
$response = $mech->submit_form(
fields => {
"key1" => "hoge",
"key2" => "foo",
"key3" => "bar",
........
},
);
#エラー処理
}
-----------------
ハッシュリファレンスにすりゃいいだけじゃないの?
>>957 レス有り難うございます。
fieldsは%item_listを参照してね、という表記が必要なのですね。
ハッシュリファレンスについて調べて見たのですが、
Mechanizeのドキュメントでも「fields => \%fields」と記載が合ったので
fields => \%item_list としてみましたがエラー吐いちゃいます。
うーん。。
959 :
958:2010/02/17(水) 20:48:55
すみません
$fields => $item_list で自己解決しました!
お騒がせして申し訳ありません。有り難うございました。
いや、>956 に書いてある事をそのまま読んだらそれはおかしくね?
fields => \%item_list
これで、通らないほうがわからん。色々変更したのかな。
follow_form( { key1=>'hoge', key2=>'foo', ...} );
引数をこうしたんじゃないかな。
963 :
sage:2010/02/18(木) 11:35:00
がんばりが足りませんでした!CGI質問板にいきます・・・ズミマゼン
...sky-blue...という文字が含まれている文字列を、
...<A>sky-blue</A>...
に置換する場合です。
$txt =~ s/$term/<A>$term</A>/g
だと-をエスケープしないとマッチしないのですが、
エスケープすると置換後...<A>sky\-blue</A>...
になってしまいます。
回避の仕方教えてください。
言っている意味がわからない
$termの中に、sky-blueが含まれてるんです。
$txt =~ s{sky-blue}{<a>$1</a>}g;
miss
$txt =~ s{(sky-blue)}{<a>$1</a>}g;
>968
おお、超thx。
そんな方法全然知らなかったです。
後方参照でググればいいと思う
どしてその場合、
/ / /
が要らないの?
>>968じゃないけど、///が要らないというか、///を{}{}に変えてる。
元のやり方だと、</a>に使われているスラッシュもエスケープしなきゃいけないし、
どこが区切りなのかがちょっとわかりづらい。だから変えたんだろう。
{}{}じゃなくても、たとえば|||なんかでもいい。
$txt =~ s|(sky-blue)|<a>$1</a>|g;
こんなのもいけたよね?
$txt =~ s@(sky-blue)@<a>$1</a>@g;
いける文字、いけない文字ってなんだっけ。
↑は確かいけたはずだけど、@は配列で使うのになーと思いつつ・・・
できるのシェルの方だっけ?
演算子が明示されているときはどんな文字で区切っても良かったはず
うぉ、マジだ。\でも#でも;でもいける。
Perlしか知らんのだけど、RubyとかPythonでも普通に出来ること?
昔は文字化けするから、パターンマッチはeucとか
決まりだったが、
最近は、unicodeのテキストファイルを扱わなくてはいけない場面が多々あって、
open(FH, "<:utf8", $filename);
とかを使い出したのですが、
パターンマッチとか、出力とかで、特に文字化けとか不具合とかないですよね?
今のところ大丈夫そうなんだけど・・・。
区切り文字って、万能に使えるのって無いよな
大抵何かとぶち当たって、その時にいいのを選ぶ
一度DBを経験すると戻れなくなるよね
そろそろ次スレを誰か頼む
次スレ立てて来ます。
983 :
デフォルトの名無しさん:2010/02/19(金) 16:48:34
A B C
D E F
・
・
という複数スペース区切りのものを
while(<IN>){
chomp;
($a,$b,$c) = split(/\s+/,$_);
というふうに取り出そうとすると、先頭の$aに何も入らず
一つづつズレてしまいます。
回避方法はありますでしょうか?
(undef, $a, $b, $c) split /\s+/;
=が抜けた
($a, $b, $c) = split;
($a, $b, $c) = split ' ', $_;
988 :
984:2010/02/19(金) 20:14:37
>>985 ありがとうございます。undefというモノが使えたのですね。
できないときは、($nasi,$a,$b,$c)とかしていたのですが。
基本的に複数スペース区切りを分けるときに、行先頭に複数スペースが有った場合に
先頭に空文字が入るのは避けれないんでしょうか?
どうもスマートでは無いような気がして。
($a, $b, $c) = /(\S+)/g;
990 :
984:2010/02/19(金) 20:18:39
>>987 リロしてなくてすみません。
そんな方法があるのですか。
どいういう仕組みか分かりませんが、ありがとうございます。