Perlコーディング初心者質問スレ Part 56
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2007/09/16(日) 19:49:43ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。
お勧めサイトは >2 以降
前スレ ttp://pc11.2ch.net/test/read.cgi/php/1180492441/
過去ログ倉庫 ttp://user.ftth100.com/mirrorhenkan/perl/
0412nobodyさん
2007/10/20(土) 14:55:48ID:o1wAy6B9短い$hogeだと関数が成功した1しか返さないことがあるようでアレ違うわと思っていました。
>>409
ちょっと離れるので投げっぱなしになってしまいそうだけど
解答してくれる人が現れる間に考えていました
use utf8;
use Encode;
$str = '
eval ($hoge); の実行した値を変数に入れるにはどうしたらいいでしょうか?
$@ だと、evalでのエラーの値が入る
でも、実行値は...?
お願いします。
';
@stream = split(/\n/,$str); #最初に渡された文字列を 改行 を区切りとして @stream に配列として読み込んだ
map{ s{(.......)}{$1\n}g } @stream; #”8文字”単位で改行を入れてる
map{print encode(sjis,$_)}@stream; #各行を出力するときにsjisに変換してる
とか、なかんじでどうよ?
ただし1バイト文字の扱いがなんか変。
*たぶんutf8でけつまずいてるかんじ。
0414409
2007/10/20(土) 17:45:16ID:???これです。こういう機能がほしかったんです。
jcode.plにはありませんでしたが、Jcode.pmにはありました。
これまで使っていたのがjcode.plだったのでが、
MIMEヘッダの機能も強化されているようなので、Jcode.pmに乗り換えようと思います。
どうもありがとうございました。
0415nobodyさん
2007/10/20(土) 18:24:36ID:???0417nobodyさん
2007/10/20(土) 19:44:36ID:???0418nobodyさん
2007/10/20(土) 20:12:44ID:???0419nobodyさん
2007/10/23(火) 05:26:38ID:???0420nobodyさん
2007/10/23(火) 14:21:34ID:???0421nobodyさん
2007/10/23(火) 15:27:18ID:???UTF8な日本語テキストの半角カナを全角にしたいと思ってEncode::JP::H2Zを使おうと思いました。
しかし、一部の文字(〜など)がEUCに変換する段階で?に変換されてしまい、困ってしまいました。
とりあえず、コードポイントにフォールバックできることがわかったので、
以下のように書いてその場をしのぎましたが、コードポイントを検索して文字に置換するという
作業が入ってしまい(しかも無駄に複雑)、どうもしっくりきません。
もっと簡単にする方法はありますか?
$text = encode("eucjp", $text, Encode::FB_PERLQQ); # EUCに変換
Encode::JP::H2Z::h2z(\$text); # 全角変換
$text = decode("eucjp", $text);
$text =~ s/\\x\{([0-9A-Fa-f]+)\}/pack("U*", hex($1))/eg; # コードポイントを文字に
0422nobodyさん
2007/10/23(火) 17:42:25ID:???#!/usr/local/bin/perl -w
use strict;
use Encode qw(from_to);
use Encode::JP::H2Z;
my $text = 'このファイルはUTF-8で〜半角カナ混じりの文字列';
from_to($text, utf8 => 'cp932');
from_to($text, shiftjis => 'euc-jp');
Encode::JP::H2Z::h2z(\$text);
print $text;
__END__
別解。
use Unicode::Japanese qw(unijp);
print unijp($text)->h2zKana->euc;
0423421
2007/10/23(火) 20:32:44ID:???ありがとうございます。その変換法で化けなくなりました。
後学のためお聞きしますが、Encodeではutf8を直接EUCにマップできないのでしょうか。
SJISを経由するのはわかるのですが、cp932をshiftjisに読み替えるなど、
トリッキーなことをやっていますね。
機種依存文字(@など)がある場合もそうですが、utf8とEUCの変換法は
どうもよくわからないです。
機種依存文字とか、どうやってEUCに変換するんでしょうか
0424nobodyさん
2007/10/23(火) 22:43:56ID:???ttp://search.cpan.org/dist/Encode-EUCJPMS/
0425nobodyさん
2007/10/24(水) 01:04:04ID:???メールフォームを使っててブラウザとサーバの間はSSLで暗号化してます
でもサーバからsendmailで送信するメールも暗号化してないと意味ないですよね?
Perlでどうやってやってます?S/MIMEかPGPが使えるの?(´・ω・`)
0426nobodyさん
2007/10/24(水) 01:05:27ID:???0427421
2007/10/24(水) 02:01:47ID:???なるほど、ぐぐってみてわかりました。
EncodeーEUCJPMSでcp51932も使えるようになるんですね。
標準のEncodeになんで実装しないんだろ、これ。
0428nobodyさん
2007/10/24(水) 06:10:09ID:???http://search.cpan.org/search?m=all&q=PGP&n=100
http://search.cpan.org/search?m=all&q=S%2FMIME&n=100
求められる安全度、対象ユーザのITリテラシ、かけられるコスト
等を検討すると、暗号化メールの使えるシチュエーションは
かなり限られてそうだ。金融機関やNSPだと大抵郵送だな。
0429nobodyさん
2007/10/25(木) 16:41:10ID:???これの実装がうまくいきません。
例えば
tenis ball は tenis or ball に変換するけど
'tenis ball' はそのままっていうのはなんとか出来たんですが、
'tenis ball' 'base ball' のときは
'tenis ball' or 'base ball' にするのがどうしても出来ません。
orを入れたい場所もクォートに囲まれてると判断されてしまうのです。
どなたか助けてください。
0430nobodyさん
2007/10/25(木) 17:03:22ID:???my @list = (
q{tenis ball},
q{'tenis ball'},
q{'tenis ball' 'base ball'},
) ;
for my $line ( @list ){
print join ' or ',
map{ /'/ ? $_ : split /\s+/, $_ }
split /\s+(?=')/, $line ;
print qq{\n} ;
}
0431nobodyさん
2007/10/26(金) 05:03:54ID:???my @token = m/('[\w\s]*'|\w+)(?:\s+|$)/g;
print join (' or ', @token), "\n";
}
0432429
2007/10/26(金) 15:02:18ID:???すみません、できるだけワードは固定してない方がいいのですが・・・うまく動きませんでした。
>>431
おぉ、なんかうまく動きそうです。
でも、クォートの部分を除外して配列に納めたいのですが、どうしたらいいのでしょうか?
0433nobodyさん
2007/10/26(金) 23:17:20ID:???430は全角文字(スペースも含め)を半角に変換してもダメか?
それと「クォートの部分を除外」って意味が分らん。単に
クォートを削除したいだけなら、そのぐらいは自力で考えてみたら?
0434nobodyさん
2007/10/27(土) 10:01:02ID:???ってなんでeucjpの糞使用なの?
ユニコードのまま渡せて処理出来ればいいのに。
0435nobodyさん
2007/10/27(土) 11:34:06ID:???そういうことはdankogaiに直接文句つけて来い
0436nobodyさん
2007/10/27(土) 13:36:03ID:???じゃあお前さんがそういうの作れば?
0438nobodyさん
2007/10/27(土) 18:53:28ID:???「〜」の文字だけがなぜか正常に送信されないのですが、なぜでしょうか?
0439nobodyさん
2007/10/27(土) 22:19:08ID:jIrqvOa/という記述の意味を教えて下さい
空ハッシュを返すという事でしょうか?
0440nobodyさん
2007/10/27(土) 22:50:14ID:???何を以て「正常に送信されない」と判断したのか。
http://ja.wikipedia.org/wiki/%E6%B3%A2%E3%83%80%E3%83%83%E3%82%B7%E3%83%A5
http://euc.jp/i18n/ucsnote.ja.html
http://www.asahi-net.or.jp/~hc3j-tkg/unicode/
>>439
http://perldoc.jp/docs/perl/5.8.8/perlop.pod
> 単項演算子の "+" は、たとえ文字列に対して用いられた場合にも、
> 何もしません。関数名に続けて括弧付きの式を書く場合に、関数の
> 引数リストと解釈されないようにするために用いることができます。
0441nobodyさん
2007/10/27(土) 23:21:31ID:jIrqvOa/ありがとうございます、単項演算子についてはわかったのですが
とあるCPANモジュールのコードで
return +{} unless $data;
というコードがあったのですがこれを
return {} unless $data;
と書かずに単項演算子の+をつけるのは
何か意図があるのでしょうか
戻り値自体はどちらでも同じような気がするのですが、、
0442nobodyさん
2007/10/28(日) 00:49:00ID:???0443nobodyさん
2007/10/28(日) 04:52:46ID:???{; } :コードブロックでコンパイル
0444nobodyさん
2007/10/28(日) 08:38:20ID:???Perlで予約語プログラミング
0445nobodyさん
2007/10/28(日) 08:48:47ID:???Perl Programming: Web::Scraperモジュールの利用
↑これ何やってるの?
0446nobodyさん
2007/10/28(日) 08:54:29ID:???Perl Catalyst Programming (入門編)
↑これも何をやっているのか、
さっぱりわからんよ
0447nobodyさん
2007/10/28(日) 09:22:22ID:???0448nobodyさん
2007/10/28(日) 09:30:40ID:???この動画だけは「何をやろうとしてるか」だけは伝わるぞ
ttp://www.youtube.com/watch?v=KyLqUf4cdwc
0451nobodyさん
2007/10/29(月) 11:17:19ID:???指定した文字が何回続いたかを取得したいのですがどうしたらいいですか?
例)この場合指定した文字は1です。
$a = '1111222';
$b = '1111136';
$aは4
$bは5
よろしくお願いします。
0452nobodyさん
2007/10/29(月) 11:56:14ID:???全角はシラネ
0453nobodyさん
2007/10/29(月) 11:59:30ID:???$c= 1;
$n= length(($a=~/((?:\Q$c\E)+)/)[0])/length($c);
0454nobodyさん
2007/10/29(月) 12:31:05ID:???$a = '111111222';
$n = '1';
$count = length(($a =~ /($n+)/)[0]);
0455nobodyさん
2007/10/29(月) 13:04:18ID:???$test_str = '111234111111';
$char = '1';
こういう場合は後半気にせず、まず見つけた連続の 3 でいいの?それとも、より長い連続の 6?
「はい、6 が得られるようにしたいんです」だと上に回答を書いた皆さんが優しくキレるかも。
あと、例なんだろうけど $a や $b は地雷踏むことがあるから気をつけてね。
0456nobodyさん
2007/10/29(月) 13:25:31ID:???use warnings;
test('1111222' => 1 );
test('1111222' => 2 );
test('111122211' => 1 );
test('111122211' => 1 , 1);
test('1111136' => 1 );
sub test {printf "%s:%s:%s\n",$_[0],$_[1],_test(@_)}
sub _test {
local($a,$b);
(sort {$b<=>$a} map {length($_)} ($_[0] =~ m{($_[1]+)}g) )[ $_[2] ? -1 : 0 ];
}
0457nobodyさん
2007/10/29(月) 17:04:12ID:???print +( length ) . qq{\n} for split /[^$i]+/ ,$a ;
0458456
2007/10/29(月) 19:24:03ID:???sub _test { ( sort map length,$_[0] =~ /(${_[1]}{2,})/g )[$_[2] ? 0 : -1] }
0459nobodyさん
2007/10/30(火) 23:38:44ID:???例えば
$mode = $cgi->param('mode');
というデータを受け取って、処理の場合わけをする場合どういう書き方がエレガントなんでしょうか?
現状は
if ($mode eq 'post') { &post}
elsif ($mode eq 'edit') { &edit;}
elsif ($mode eq 'delete') { &delete}
else { &error}
こんな感じなのですが、それは初心者の書き方だって馬鹿にされました。
悔しいのでもっと効率的な方法があったら教えてください。
0460JAPU ◆lVJAPUTeX.
2007/10/30(火) 23:52:20ID:???エレガントかは分からないけど、分岐がある程度多い場合はこんな書き方だとすっきり書けるかと。
%actions = (post => \&post,
edit => \&edit,
delete => \&delete);
if(exists $actions{$mode}) {
$actions{$mode}->();
} else {
error();
}
数個程度なら if で分岐されちゃってもいいと思いますし、実際そうしています。
0461nobodyさん
2007/10/30(火) 23:58:03ID:???それでいいんじゃね?
各サブルーチンに戻り値があるなら「三項演算子」って手もあるし、
以下の様なやり方もあるけど、普通に書いてメンテ出来るものならば
バカにされても放置しとけば?
my %hash = (
post => sub { 1 } , # &post の内容を書く
edit => sub { 2 }, # &edit の内容
delete => sub { 3 }, # &delete の内容
) ;
print $hash{'edit'}->() || q{error} ; #q{error} には&error あたりを、、、
ソース全体を見たら綺麗な書き方があるかもしれんが、
それに関しては情報不足。
0462nobodyさん
2007/10/30(火) 23:59:04ID:???0463nobodyさん
2007/10/31(水) 00:10:35ID:???if文分岐も分かりやすいと思うが、へたに小細工するとますますへたっぴに見える。
0464nobodyさん
2007/10/31(水) 12:11:23ID:???使いたくない書き方No1かも。
0465nobodyさん
2007/10/31(水) 13:29:29ID:???: $expr3 ? $expr4
: $expr5 ? $expr6
: $expr7
;
書き方か頭が悪いんだろ
0466至急
2007/10/31(水) 15:17:23ID:???CGIに詳しく都内に来れる方であれば可能
一日日払い即金で払います。
詳細はメール下さい。
0467nobodyさん
2007/10/31(水) 15:47:41ID:???エレガントかしらないけどこんなパッケージ作ってる。
(不要箇所削ったのでそのまま動くか不明)
package Local::Base;
use strict;
use warnings;
our $DEBUG = 0;
sub class {ref$_[0]||$_[0]||__PACKAGE__}
sub new {(bless {} => class( shift() ))->init(@_)}
sub mode :method {shift->param('mode',@_)}
sub method_name :method {shift->{method_name}->{ shift() }}
sub default_method :method {die('不正なmodeを受け取りました')}
sub init :method {
my $self = shift;
my %param = @_;
$self->{method_name} = $param{method_name} || {};
return $self->run_method( $self->mode , @_ );
}
sub run_method :method {
my $self = shift;
my $method = $self->method_name( shift );
$method = 'default_method' unless $method && $self->can( $method );
return $self->$method(@_);
}
1;
0469nobodyさん
2007/10/31(水) 19:51:49ID:???使い方も書いたつもりだったんだけど書けてなかった。
#!/usr/bin/perl
use strict;
use warnings;
use base qw(Local::Base);
my $r = eval{
__PACKAGE__->new(
method_name => {
edit => 'edit',
post => 'post'
}
)
} || $@;
print CGI->header,$r,"\n" unless ref $r;
######################################################################
# editの動作を定義
sub edit :method {
my $self = shift;
print $self->header;
print "EDITモード";
return $self;
}
1;
0470nobodyさん
2007/10/31(水) 20:11:48ID:???この :method って何の意味だっけ
perlsub見ても載ってないや
変数にも付けれた気がしたが
0471nobodyさん
2007/10/31(水) 21:09:19ID:???perl attributes でググれば日本語のサイトも沢山出る。
変数に付けられるのは 5.8系
0472nobodyさん
2007/11/01(木) 01:06:18ID:???自分でゴチャゴチャ作るよりも。使ってる人いる?
0473nobodyさん
2007/11/01(木) 02:26:10ID:???0474nobodyさん
2007/11/01(木) 10:48:57ID:???CGI::Application もフレームワークじゃないの?
0475nobodyさん
2007/11/01(木) 17:27:41ID:???:methodは組み込みのattribute
Attribute::Handlers使うと自作のattributeも作れる。
…がいつ仕様が定まってなくて変更があるかもってどっかで読んだ気がする。
>>474
・自分しかいじらない
・少人数で知識の共有が容易
・マニュアルが整っている
のどれかなら自作のフレームワークの方が慣れてるだろうし開発効率いいんじゃないかな?
フレームワーク自体のメンテナンスが(出来る|しなきゃいけない)のはデメリットか?
既製のフレームワーク使うのは
・他の人と知識の共有しやすい
・ドキュメントがある/(第3者も使ってるので)ノウハウが検索しやすい
・フレームワーク自身のメンテナンスを(あまり)しなくていい
ってとこかな?
0477nobodyさん
2007/11/02(金) 11:22:36ID:???別名で保存するにはどうすればいいでしょうか
Perl 5.8.8なのでuse Encode;を利用する、読み取り専用で1行ずつ変換処理する
あたりまでは勉強しました。スマートな方法よろしく御教示おねがいします
0478nobodyさん
2007/11/02(金) 13:22:56ID:???データはutf-8のままのほうがよくないかな。
0481nobodyさん
2007/11/02(金) 16:43:20ID:???0482nobodyさん
2007/11/02(金) 17:17:33ID:???すげー!、シェルスクリプトですよね?
sshができない場合はこんな感じで利用すればいいのかな
system("nkf -s log.txt > log.sjis.txt");
1つ気になるのがjcode.plなど元の文字コードを指定するのがあると思うのですが、
&jcode::convert(\$_, 'sjis' ,'utf8');
nkfでは気にしなくても自動判別完璧なのでしょうか?
0483nobodyさん
2007/11/02(金) 17:34:58ID:???0484nobodyさん
2007/11/02(金) 17:51:47ID:???use Perl6::Slurp;
use Jcode;
$c = slurp "log.txt";
Jcode::convert(\$c, "sjis", "utf8");
open($fh, ">", "log.sjis.txt");
print $fh $c;
>>482
jcode, Jcode, nkfは、判別できる場合は判別してくれる。
0486nobodyさん
2007/11/05(月) 07:24:22ID:???コマンドプロンプトだとnslookup -> set type=***
UNIXならhost -t ***
でクエリタイプを設定できるんですけど、PERLの場合はどうやるのでしょうか。
0487nobodyさん
2007/11/05(月) 10:55:44ID:???http://search.cpan.org/~olaf/Net-DNS-0.61/lib/Net/DNS.pm#Find_the_nameservers_for_a_domain.
0488nobodyさん
2007/11/05(月) 11:20:15ID:6nXAnQ+nopen(FILE,">".$workFname) or die "Cannot Output File: ";
あらかじめファイルを持たせておいて、書き込み権限を与えておけば
成功しますが、新規にファイルを作成できません。
どうすればいいのでしょうか。
0489nobodyさん
2007/11/05(月) 12:21:09ID:???0491nobodyさん
2007/11/05(月) 13:19:35ID:???0492nobodyさん
2007/11/05(月) 13:22:45ID:???できれば相対パスのままで動くようにしたいです。どうすれば解決できるか分かる
方はおられませんか。まあ、あまり解決策が複雑なら、とりあえずあきらめてこの
ままにしておくつもりですが。
0493nobodyさん
2007/11/05(月) 14:36:06ID:???まず「何を」相対パスにしようとしているのかくらい書こうぜ。
あと「自分の環境」は書かなきゃ誰にも伝わらない。
0494nobodyさん
2007/11/07(水) 09:25:24ID:R3XG8Srf0496nobodyさん
2007/11/07(水) 11:46:06ID:R3XG8Srf#!perl/bin/perl
use strict;
sub kansu{
my $ref1 = shift;
my $value1;
foreach $value1($$ref1) {
print $value1 . "\n";
}
}
sub main{
my @databox1 = (13,1,6,3,9,8);
my $ref1 = \@databox1;
usort_kansu(@databox1);
}
main();
0497nobodyさん
2007/11/07(水) 11:47:42ID:???正: kansu(@databox1);
0498nobodyさん
2007/11/07(水) 12:36:16ID:???「言語的意味で」正しく挙動させるには
foreach $value1($ref1) {
(多分)あなたの望んだ挙動にするには
ソースの殆どに手を入れる必要がある。
∴ 本読んでからどうしても分らんかったら
質問し直せ
0499nobodyさん
2007/11/07(水) 14:24:36ID:???#!perl/bin/perl -w
use strict;
sub kansu {
my $ref1 = shift;
# my $value1;
foreach my $value1 (@$ref1) {
print $value1 . "\n";
}
}
sub main {
my @databox1 = (13,1,6,3,9,8);
my $ref1 = \@databox1;
kansu($ref1);
}
main();
0500nobodyさん
2007/11/07(水) 15:22:14ID:vLJSXT0R.qmailからperlスクリプトを呼び出しているのですが、その場合エラーログを取るにはどうしたらよいのでしょうか?
不正終了しているようなのですが、原因がつかめません。
0501nobodyさん
2007/11/07(水) 15:43:21ID:???if ($@) {
open(LOG, ">>/path/to/ログファイル名") or die;
print LOG "WARNING: $@";
close(LOG);
}
こういうスクリプトをqmailから呼び出せばどーよ
>499
forearch行を書き換える条件だからforearch my $value (@_){ って書いて欲しかったのかと・・
0502501
2007/11/07(水) 15:59:10ID:???こうか
0504nobodyさん
2007/11/07(水) 18:20:14ID:???ログが見えないならプログラムを置くべきではないと思う。
0506500
2007/11/07(水) 19:59:45ID:???qmailのログとはmaillogでしょうか?
スクリプトからは何もログを吐いていないんです。
sudoでapache権限で実行してるからログ吐かないのかな。
0507nobodyさん
2007/11/07(水) 20:05:11ID:???0510500
2007/11/07(水) 22:29:30ID:???いえ。
.qmail内でperlのみsudoしてapache権限で動かしてます。
qmailはvpopmail権限で動かしてますよ。
>>507さんでログ取れました。m(__)m
0511nobodyさん
2007/11/09(金) 15:33:58ID:???■ このスレッドは過去ログ倉庫に格納されています