トップページ⇒php
1001コメント375KB

Perlコーディング初心者質問スレ Part 39

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん04/11/27 11:35:03ID:DJwiGeFM
Perlのコーディングで困ってる人のスレです。

【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。

1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。

最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。

過去ログやお勧めサイトは >>2-10
0482nobodyさん04/12/26 00:16:31ID:???
form要素でdatファイルに書き込みをするようにしたんですが、
type="file"を使うときはenctype="multipart/form-data"にしろ、とあったので、
form要素にそれを記述したら、書き込み自身できなくなりました。
サーバーによってファイルのアップロードができない、とかそういうのはあるんでしょうか?
0483nobodyさん04/12/26 00:22:40ID:???
>>482
マルチパートに対応した方法でよまないとだめ。
0484nobodyさん04/12/26 00:32:26ID:???
>>483
そうなんですか。
その言葉をヒントに調べてみます。
048548204/12/26 01:58:00ID:???
調べて読んでみましたが、絶望的に分かりませんでした。
データの受け取り方がテキストとは違うようですね。
0486nobodyさん04/12/26 02:11:01ID:???
>>485
フォームからCGIへ値を渡す時、何を使ってデコードしてるんだい?
CGI_Lite.pmあたりを使ってりゃ、問題は無いはずだよん。
0487nobodyさん04/12/26 02:14:01ID:???
ソースはりゃいいだろ
048848204/12/26 02:24:06ID:???
>>486
if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
} else { $buffer = $ENV{'QUERY_STRING'}; }
とやって、$bufferを散々弄繰り回しておりました。

type=fileを使うのは初めてなので緊張してます。

CGI_Lite.pmというものを探して使い方を勉強してみます。
有難う御座いました。
048948204/12/26 03:25:48ID:???
cgi_lib.plというのを使って、バイナリデータを拾うところまで出来ました。
あとは、これを画像ファイルとして生成するだけなんですが、
GIF89aから始まる文字列の中のどこに元々のファイル名が含まれてるんでしょうか。
抽出方法がありましたら教えてくださいますようお願い致します。
単純に文字列の中には見つかりませんでした。
0490nobodyさん04/12/26 03:28:57ID:???
意図的にコメントなどで埋め込まない限りファイル名なんて入ってねーよ
049148204/12/26 03:31:54ID:???
>>490
回答有難う御座います。
ということは、<input type="file">のパスを抽出出来るようにしなくちゃいけないわけですね。
なんだかいろいろ見えてきたような気がします。頑張ります。
0492nobodyさん04/12/26 04:28:34ID:???
しなちくも何も、 cgi_lib.plの中身を読めばいいだろ。
0493nobodyさん04/12/26 09:31:51ID:mhqMgdk4
教えてください。

PHPからperlをexecで実行させる処理を書いてるのですが
perlスクリプトへの引数で
エスケープが必要な文字ってなにがあるのでしょうか?

試した限りでは
" は \"
\ は \\
にして " で囲えばいいかなと思ったのですが。
0494nobodyさん04/12/26 10:04:43ID:???
"で囲まなくても、
print qq|ここに"でも\でも好きなだけ書くがよい|;|
0495nobodyさん04/12/26 10:08:15ID:???
おっと、最後の|が余分だた
049649304/12/26 10:28:19ID:???
>>494
ごめんなさい
実行スクリプトの引数の話しです

第一引数:aaa
第二引数:aa"a
第三引数:a\a

xxx.pl "aaa" "aa\"a" "a\\a"

こんな感じなのですが
0497nobodyさん04/12/26 13:04:55ID:???
それは Perl とは関係なくシェルのメタ文字をエスケープせんとならんつう話だな
PHP なら escapeshellarg 使えば済むような気がするが、スレ違い気味だ
0498nobodyさん04/12/26 13:06:01ID:RQ2dyxHH
あのさぁ、やってみりゃ答え出ることじゃん。
print join("\n", @ARGV),"\n"; とかやって確認できない?
0499nobodyさん04/12/26 22:55:50ID:???
>>497
Thx!

>>498
そうですね
0500nobodyさん04/12/26 23:47:49ID:???
つか、PHP厨なんだからPHPだけで完結するようにしてしまえばいいだろ。
PHPでPerlなんか起動するなよ。
0501nobodyさん04/12/27 00:04:29ID:???
>>500
そうです
0502nobodyさん04/12/27 08:22:06ID:???
そんなPHPを責めないで…
俺もmySQL使う時はPHP使うよ。
Perl+DBは遅いイメージがあるし、mod_perl使えないし。
誰かこのイメージ払拭させてくれませんか?(スレ違い)
0503nobodyさん04/12/27 08:58:00ID:???
>>500
はい。すみませんでした
0504nobodyさん04/12/27 14:15:25ID:Wb/eo+Or
質問させてください。
useの行で

$ ../xxx.pl
Can't locate xxx.pm in @INC (@INC contains: /usr/lib/perl5/5.6.1/i386-
linux /usr/lib/perl5/5.6.1 /usr/lib/perl5/site_perl/5.6.1/i386-linux /
usr/lib/perl5/site_perl/5.6.1 /usr/lib/perl5/site_perl /usr/local/lib/
site_perl/5.6.1/i386-linux /usr/local/lib/site_perl/5.6.1 /usr/local/l
ib/site_perl .) at ../xxx.pl line 39.

となってしまいます。

useの行の前で
push(@INC, '/xxx/xxx/xxx');
としてxxx.pmがあるパスを指定してるのですが
それがエラーメッセージの「@INC contains」に表示されていません。

@INCに追加できていないということなのでしょうか?
0505nobodyさん04/12/27 14:18:01ID:???
use lib '/xxx/xxx/xxx';
かuseの前に
BEGIN
{
push(@INC, '/xxx/xxx/xxx');
}
050650404/12/27 14:28:57ID:???
>>505
ありがとうございます!

スクリプトを読み込むと同時にuseが処理されてたということ
だったのですね
ずっと悩んでました m(__)m
0507nobodyさん04/12/27 15:51:41ID:???
携帯コンテンツ等の、セッション管理について質問です。

私は今までずっと引数でセッションIDを引き回す方法をとって
いたのですが、とある案件でmod_perlの「PerlTransHandler」と
いうものを使うことにより、自作モジュールをプログラム読み
込み前にロードし、セッションIDをsubprocess_envというものを
使用して環境変数に埋め込むという方法を知りました。

これであれば引数を使用することはなくなりますし、静的ペー
ジでもセッションIDを保持することが出来ます。

これからこの方法を使っていこうと思ったのですが、今回の
案件がモジュールのインストール関連を許可してくれない
関係で、この方法はとれなくなってしまいました。

この他に似たような方策があれば、ご教授いただきたく思っ
ております。
宜しくお願いいたします。
0508nobodyさん04/12/27 17:19:58ID:d87nS7mB
文字コードはEUCです。

my $a = "123456789";
$a =~ s/(?:\xA3([\xB0-\xB9]))/ chr(ord($1)-0xB0+ord('0')) /eg;
print $a;
>123456789

↑自分で全角数字を半角数字に変換するコードを考えたのですが、
マルチバイト文字などの中間に誤ってマッチしてしまいます。
例→隠隠
1文字目の2バイト目が\xA3で、2文字目の1バイト目が\xB0-\xB9である組み合わせには
完全に誤作動してしまいます。

どうすればよいでしょうか?
0509nobodyさん04/12/27 20:29:10ID:???
>>508
ほとんどFAQだが、

(1) 5.8以降のユニコード機能を有効にすればtr/0−9/0-9/でいけるが
いろいろ落とし穴が(笑)

(2) Jcode.pmのtrを使う

(3) 自分で書きたければ ttp://www.din.or.jp/~ohzaki/perl.htm
あたりが参考になるだろう

0510nobodyさん04/12/27 20:32:05ID:???
>>507
Apache::ClickPath かあ。URLのパス部分にセッションIDを埋め込むやつだよね。
頑張れば mod_rewrite で似たようなことを実現できそうな気もする。
ただその場合「Perl コーディングの質問」では無くなってしまうのだけれど。
「mod_rewrite すらダメ」と言われると厳しいかも。
0511nobodyさん04/12/27 21:12:19ID:???
>>510
そうです!まさにそれでございます!
mod_rewriteでしたらできる可能性があるんですね。
ちょっと上司に使用許可を求めてみたいと思います。
0512nobodyさん04/12/28 11:03:41ID:???
0を渡したら、aa
1を渡したら、ab
(略)
25を渡したら、az
26を渡したら、ba
(以下略(ただし、zzまでの有限配列))
となるようにしたいのですが、どうすればいいのでしょうか?
全部記載した配列を使ってるのですが、重そうなので簡単な方法があれば知りたいです。
おねがいします
0513nobodyさん04/12/28 11:16:40ID:???
>>512
キミがしたいのは、こうゆうことか?

foreach ('aa' .. 'zz'){
$list[$count++] = $_;
}
051450804/12/28 11:18:22ID:/d0b1jT1
>>509
jcode.plでもできるようです^^;
アホなことをしてしまいました。
しかしどうやってるのでしょうか?

>1文字目の2バイト目が\xA3で、2文字目の1バイト目が\xB0-\xB9である組み合わせには
>完全に誤作動してしまいます。

これをどうやってクリアにしたのか気になってjcode.plのtrの中身を
見てみましたが・・・・・・・orz
字句解析でもしてるんだろうか
051551304/12/28 11:44:05ID:???
>>512
おっとおいらもボケていた。この1行で終り。

@list = ('aa' .. 'zz');
051651204/12/28 12:11:25ID:t9GmHYc3
>>513
> >>512
> foreach ('aa' .. 'zz'){
> $list[$count++] = $_;
> }
今、それとほぼ同じコードなんだけど、676個も要素をメモリに読み込んでるから軽く出来る方法はないかとカキコしますた
0517nobodyさん04/12/28 13:22:09ID:???
このスレであってるか微妙ですが、
掲示板のCGIで半角カナを使用するために半角カナが使用できるjcode.plを入れたのですが、
どうやら掲示板のCGIの方でも改変すべき箇所があるみたいです。
jcode::convert(\$value,$gl->{mycode});
if ($gl->{mycode} eq 'sjis') {jcode::h2z_sjis(\$value); }
if ($gl->{mycode} eq 'euc') {jcode::h2z_euc(\$value); }
か
jcode::convert(\$message,'jis');
あたりだと思うのですが半角カナ→全角カナへのコンバートをしないようにするためにはどうすればいいのでしょうか
0518nobodyさん04/12/28 14:48:39ID:???
h2z はよくプログラミングで使われるパターンで、
hankaku to zenkaku の意味
0519nobodyさん04/12/28 14:58:26ID:???
半角カナが使用できないjcode.plなんてあるのか?
0520nobodyさん04/12/28 16:02:26ID:???
>517
jisコードには半角カナが無いので、jisコードに変換した時点でアウト
052151804/12/28 16:16:28ID:???
>>520
なこたぁーない。
0522nobodyさん04/12/28 16:23:22ID:???
>>517
一番下のはメールの本文っぽいな
0523nobodyさん04/12/28 16:31:52ID:???
投稿を管理者にメール送信ってやつかもね。
それだったらJISへ変換は当然として、そこは半角にはできないな。
いずれにしても改造スレのほうが適切じゃないか?
0524nobodyさん04/12/28 18:23:28ID:???
SJISって言おうぜ。JISは別物が既にあるんだし。
0525nobodyさん04/12/28 18:30:26ID:???
>>524
JISの話しなんだが・・・
0526nobodyさん04/12/28 20:08:29ID:???
質問です、

$var1='あかさたなはまやらわ';
$var2='亜加差多菜羽真矢裸和';

この二つの変数を使って
s/あ/亜/g;
s/か/加/g;
s/さ/差/g;
…
みたいな置換をしたいのですがグルっても分かりませんでした。どういう処理をすれば良いんでしょうか。
052751704/12/28 21:20:58ID:???
>>518-523
レスありがとうございました。
良く考えたら半角→全角変換しないでいいのならjcode.pl自体使う必要がないので、
cgi中からjcode.plを抜き取ればいいだけでした。
0528nobodyさん04/12/28 21:36:42ID:???
>>512
my @key = ('a'..'z');
my $keynum = scalar @key;

# my $d = 675;
my $code = $key[$d/$keynum].$key[$d%$keynum];

# 繰り返し使うなら、配列の方が負荷は軽いと思う。

>>526
文字コードとPerlバーションを書くべし。

>>527
JISコードへのコンバートはしなくていいの?
052952604/12/28 22:01:07ID:???
>>528
SJISです。
バージョンは5.0(AAACafe)ですが、多分5.8にうpすると思います。
0530nobodyさん04/12/28 22:02:20ID:???
>>527
それでいいのか?携帯サイトか?
SJIS(つーかページのエンコード)以外の文字コード送られてくる可能性は無いのか?
0531nobodyさん04/12/28 23:30:38ID:???
>>529
微妙だね。
String::Multibyteを使ったもの。
use String::Multibyte;

my $mbcs = String::Multibyte->new("shiftjis");

my $var1='あかさたなはまやらわ';
my $var2='亜加差多菜羽真矢裸和';
print $mbcs->strtr('あめんぼ あかいな あいうえお', $var1, $var2);
053253104/12/28 23:32:16ID:???
jcode.plを使ったもの。
require 'jcode.pl';

my $var1='あかさたなはまやらわ';
my $var2='亜加差多菜羽真矢裸和';
my $tr = sjis_tr($var1, $var2);
print $tr->('あめんぼ あかいな あいうえお');
exit;

sub sjis_tr
{
my ($from, $to) = @_;

jcode::euc(\$from, "sjis");
jcode::euc(\$to, "sjis");

return(
sub {
my $line = shift;
jcode::tr(\$line, $from, $to);
return($line);
});
}
--
encodingを使ったもの。
use encoding "shiftjis";

my $str = 'あめんぼ あかいな あいうえお';
$str =~ tr/あかさたなはまやらわ/亜加差多菜羽真矢裸和/;
print $str;
053353104/12/28 23:38:14ID:???
自力で(無茶な方法採用。)

my $var1='あかさたなはまやらわ';
my $var2='亜加差多菜羽真矢裸和';
my $tr = sjis_tr($var1, $var2);

print $tr->('あめんぼ あかいな あいうえお');
exit;

sub sjis_tr
{
my ($from, $to) = @_;

my $sjis = '[\x00-\x7e]|[\x0x81-\x9f\xe0-\xef][\x40-\x7e\x80-\xfc]|[\xa1-\xdf]';
my %keys;
my @key_code = ($from =~ /($sjis)/g);
@keys{@key_code} = ($to =~ /($sjis)/g);
my $key = '('. join('|', map{ quotemeta($_) } @key_code). ')';
my $pattern = qr/\G((?:$sjis)*?)$key/;
return(
sub{
(my $str = shift) =~ s/$pattern/$1$keys{$2}/g;
return $str;
});
}
053453104/12/29 00:18:35ID:???
jcode.pl版は間違いがありました…以下差し替えで。
sub sjis_tr
{
my ($from, $to) = @_;

jcode::convert(\$from, "euc", "sjis");
jcode::convert(\$to, "euc", "sjis");

return(
sub {
return jcode::sjis(jcode::trans(
jcode::euc(shift(), "sjis"), $from, $to), "euc");
});
}
0535nobodyさん04/12/29 09:57:56ID:???
>>531
おまいイイ奴だな
0536nobodyさん04/12/29 17:03:10ID:???
>>531-534
わ、凄いです、ありがとうございます
0537nobodyさん05/01/03 03:52:58ID:BvOHark/
配列で任意の要素以外の要素を取り出したいんだけどどうしたらいいんだろう?

例えば
 @foo = qw(1 2 3 4 5 6);
という配列があったら

1:2 3 4 5 6
2:1 3 4 5 6
3:1 2 4 5 6
4:1 2 3 5 6
・・・

というように取り出したい。
foreachとifを使って地道にやらないとだめかなぁ
0538nobodyさん05/01/03 04:07:18ID:???
>>537
@hoge = grep(!/いらない値/, @foo); とかやって@hogeから
0539nobodyさん05/01/03 04:17:37ID:Jw9YIMiU
阿\xa5鬢\xb3壜\xa3

今作成中のアクセス解析でshift_jisで出力した際
検索文字列に上のような文字化けが出るんですが、
これ元がどの言語コードが分かりますでしょうか?
漢字 \ x アルファベット 数字
という規則的な並び方してるのですが、
お分かりの方いたらご教授お願いしますm(__)m
0540nobodyさん05/01/03 04:35:28ID:???
>>537
俺だったら、おとなしくforeachを使うと思う。
少し考えてみて、いい方法があったら、後で書き込みます。

>>538
それだと、配列中に要らない値が重複して存在する場合、
その値に対応する要素が複数削除されるぞ。
0541nobodyさん05/01/03 04:44:00ID:???
>>540
>それだと、配列中に要らない値が重複して存在する場合、
>その値に対応する要素が複数削除されるぞ。
元質問だといらない値以外が残ればいいんじゃないの?
0542nobodyさん05/01/03 04:48:34ID:???
>>539
shift_jisで出力する前の値を書け
054354005/01/03 05:39:41ID:???
splice(array, offset, length)
を使えば楽みたいね。今まで使った事なかった、鬱 orz

例(※検証してません):
@foo = qw(1 2 3 4 5 6);
splice(@foo, 1, 2);
print join(',',@foo) , "\n";

結果:
1,4,5,6
0544nobodyさん05/01/03 06:08:27ID:???
コーディングとはちょっと違うんだけど。
CPAN 経由でインストールしたモジュールをアンインストールするには
どうすればいいの??
0545nobodyさん05/01/03 07:29:08ID:???
>>544
cpan使ったことないけど、
cpan -c
かと。
0546nobodyさん05/01/03 14:59:35ID:???
@bar= @foo[0 .. $n-2,$n..$#foo];
0547nobodyさん05/01/03 15:21:38ID:???
>>543
元質問をちゃんと読んでる?
0548nobodyさん05/01/03 15:33:20ID:???
>>539
言語コード???
0549nobodyさん05/01/03 15:50:56ID:???
>>547
というか元質問自体が曖昧なので、同じ値を削りたいのか
n番目の値を削りたいのかどちらともとれるし。
055054005/01/03 16:01:28ID:???
>>547
読んでるよ。
offsetとlengthは、537に合うように変えてくれれば良い。
その意図で543の様に書いたんだし。

ま、549の言う通りだな。
540の指摘が癇に障ったなら謝るわ。
0551nobodyさん05/01/03 16:02:09ID:???
>>549
>1:2 3 4 5 6
>2:1 3 4 5 6
>3:1 2 4 5 6
>4:1 2 3 5 6

これは表示結果なのか、あるいは1を任意の要素(の値)とすると
残りの要素(の値)である2 3 4 5 6を取り出したいのかわからんね。

まあ、>>537が再度書くまで放置するしかあるまい。
0552nobodyさん05/01/03 16:02:10ID:???
>>537
中身を見て、取り出すなら。('3'を取り出してみるとすると)
my @foo = qw(1 2 3 4 5 4 3 2);
my @found = grep{ not index($foo[$_], '3') }(0..$#foo);
defined $found[0] and splice(@foo, $found[0], 1);

# grepがちょっぴり優雅だから、普段はforeach回すかなぁ。
0553nobodyさん05/01/03 16:21:47ID:???
それって@foo[2]の3だけ除くんでしょ?
だったらそこまで複雑にしなくても>>543のように

splice(@foo, 2, 1); でいいのでは?
0554nobodyさん05/01/03 16:24:24ID:???
言い方がおかしいか。
「@foo[2]の3だけ除かれる」
0555nobodyさん05/01/03 17:05:07ID:???
>>553-554
>>552は中身が'3'の最初のものを削除するんだけど、
'3'が常に$foo[2]にあるとは限らないとしたら?
または、配列に'3'が含まれていなかったら?

質問では、配列の内容は
> 例えば
だから実際は、
use List::Util qw(shuffle);
my @foo = shuffle (1..10);
なんて物かもしれないしね。
0556nobodyさん05/01/03 17:15:15ID:???
>>555
>'3'が常に$foo[2]にあるとは限らないとしたら?
>または、配列に'3'が含まれていなかったら?
全然影響しないでしょ。

>splice(@foo, 2, 1);
foo[2]を1個取り除くだけなんだから。

元質問が複数の要素を一度に取り除いたものを得たい、または
要素の中から任意の「値」を取り除いたものを得たいのなら別だけど。
0557nobodyさん05/01/03 17:35:35ID:???
>>556
> 中身を見て、取り出すなら。('3'を取り出してみるとすると)
> 中身が'3'の最初のものを削除するんだけど、
これは無視?

> 要素の中から任意の「値」を取り除いたものを得たいのなら別だけど。
別も何も、これをコード化したものですが。

>>549さんの
> というか元質問自体が曖昧なので、同じ値を削りたいのか
> n番目の値を削りたいのかどちらともとれるし。
という意見の"同じ値を〜"の方のコードを書いたまでです。
055853705/01/03 19:03:14ID:BvOHark/
質問が曖昧すぎて混乱させてしまいました。申し訳無いです。
深夜に作業するもんじゃないですね。

n番目の値以外の要素を取り出したい、と言うのが真意でした。

#n番目の値以外を全て足し合わせると言うルーチンを作りたかった
#
#@foo = qw(1 2 3 4); という配列があったら
#$bar[0] = 2+3+4
#$bar[1] = 1+3+4
#$bar[2] = 1+2+4
#$bar[3] = 1+2+3

要素は重複する可能性があります。
#grepでそのままやるのは無理そう?
0559nobodyさん05/01/03 19:39:41ID:BmWNnWLw
Perlの関数の括弧があるのとないのって、どう違うんでしょうか?

例↓
open IN, "aaa.txt";
open(IN, "aaa.txt");

私の持っている本には、括弧が書いてある本と書いていない本が
あるのですが、括弧についての説明がなくてよく分かりません。
説明しているサイトも見つけられませんでした。
よろしくお願いします。
0560nobodyさん05/01/03 20:13:20ID:1lDTWYQS
括弧が無い場合、Perl が勝手に括弧を補って構文解析してくれる。

ほとんどの場合プログラマの意図したとおりに補ってくれるが、
ごく稀に、意図しないところに括弧を補って恐ろしい動作をしてくれることもある。
まあ演算子の優先順位を厳密に考えてれば防げることなんだが、
それよりは括弧を明示的に付ける方が楽ではある。
0561nobodyさん05/01/03 21:21:18ID:???
>>558
配列を壊していいならspliceで、壊したくなければ>>546の配列
スライスでいいんでない。要素の位置で指定する場合は配列を
そのままgrepでは無理です。どうしてもgrepつかいたけりゃ
0..$#fooでインデックスの配列作ってそっちにgrepする手はある
けど。

オーバーフローや浮動小数点の誤差を気にしなくていいのならば、
配列を加工しようとせずに全部の要素の和からn番目の要素の値を
引き算する方がいいかもね。

0562nobodyさん05/01/03 21:30:46ID:???
COOKIE、GET、POSTとかで、%00をブロックした方が良いって聞いたけど、
どこをブロックすればいいの?
正規表現で全部チェックすれば良いのかな。。。

あと、安全のためにブロックした方が良い文字ってある?
0563nobodyさん05/01/03 21:37:14ID:???
>>562
どの文字をブロックするか考えるより、何を通していいか考えて
それだけ通すようにした方がいいと思うよ。

あとは出力するときに過不足なくエスケープすること。

-Tフラグを使うとすこし安心かもね。汚染除去するときの正規
表現を適切なものにしないと意味ないけど。

056455905/01/03 22:38:42ID:???
>>560
それじゃ、Perlでは括弧は常につけておいた方がいいということなんですね。
他の言語はVBしか知らないのでVBですみませんが、
VBだと関数の戻り値がある場合は括弧が必須で、
ない場合はどちらでもいいようです。
Perlでも何か違いがあるのかと思っていました。
どうもありがとうございました。
0565nobodyさん05/01/04 01:14:24ID:WiFbXIfd

Perlは変幻自在な妖怪みたいな言語
0566nobodyさん05/01/04 02:41:43ID:???
                        ,. -?‐ `'' 、
   ┏┓  ┏━━┓        /.,;彡;, ..,;,.   ゙ミヽ、     ┏━━┓  ┏┓  ┏━┓
 ┏┛┗┓┃┏┓┃       /ソノ;彡;彡;彡;彡'゙ヽ;゙i;,ヽ   ┃┏┓┃┏┛┗┓┃  ┃
 ┗┓┏┛┃┗┛┃┏━━━{i;゙|il|l!ノ彡';彡;'','⌒ ゙!l!l}i゙!━┓┃┃┃┃┃┏┓┃┃  ┃
 ┏┛┗┓┃┏┓┃┃      {ノl!|!;ソ;ノリノ'″Perlノ;li|l!1  ┃┃┃┃┃┗┛┃┃┃  ┃
 ┗┓┏┛┗┛┃┃┗━━━'{i|{il{li゙!ソ;'  ` ' `"″!l}!i|!━┛┃┃┃┃    ┃┃┗━┛
   ┃┃      ┃┃         '{;l!|{i!リ''  _ノ    ;i|!レ'     ┃┗┛┃  ┏┛┃┏━┓
   ┗┛      ┗┛        '゙i!|!;'、,_´__,ノ '″    ┗━━┛  ┗━┛┗━┛
0567nobodyさん05/01/04 18:05:38ID:???
質問です。

例えば、$mesに文字列「あああああ<p>あああいいい</p>いいうええええ」
が入っていたときに<p>から</p>までの間の「あああいいい」を取り出すにはどうしたら良いでしょうか?

よろしくお願いします(;´Д`)人
056856705/01/04 18:09:51ID:???
あ、違った・・・すみません、脳みそまとめてから質問しますorz
0569nobodyさん05/01/04 18:16:31ID:ufv1QlyO
スレ汚しすみません。改めて質問です。

例えば、$mesに文字列「あああああ<p>あああいいい</p>いいうええええ」が入っていたときに
<p>から</p>までの間の「あああいいい」を編集して例えば「いいいううう」等にして
$mesが「あああああ<p>いいいあああ</p>いいうええええ」となるようにしたいのですが
どのようにしたら出来るでしょうか?
0570nobodyさん05/01/04 18:27:37ID:???
置換えなら正規表現でもいいが、編集してって何よ?
0571nobodyさん05/01/04 18:47:37ID:???
その置き換えを<p>から</p>までするにはどうしたらいいんでしょうか・・・
0572nobodyさん05/01/04 19:20:58ID:???
>>569
# <p>〜</p>までを抜き出す
$mes =~ m|^(.+)<p>(.+)</p>(.+)$|;
$before = $1;
$inside = $2;
$after = $3;

# 中身を書き換える
$inside = "いいいううう";

# つなげる
$mes = "$before<p>$inside</p>$after";

ってこと?
0573nobodyさん05/01/04 19:27:40ID:???
はいっ、そういうことです。
0574nobodyさん05/01/04 23:16:36ID:Y/b3Mf5i
質問なのですが、
Use strict;
を使って書いてるのですが、サブルーチンの中から複数の値を返したい時はどうすれば良いのでしょうか? 

例えばですが、
sub a{
my $a = 1;
my $b = 2;
my $c = 3;
}
というサブルーチンがあったとして、$a, $b, $c, それぞれの値を参照したいという感じなんですが・・・・。
既に出たような質問だったらすみませんが、よろしくお願いいたします。
0575nobodyさん05/01/04 23:21:43ID:???
>>574
配列で返す

($a1,$b1,$c1) = a();

sub a {
my $a = 1;
my $b = 2;
my $c = 3;
return ($a, $b, $c);
}

既に何度も出ているような気はまあ確かにする
057657405/01/04 23:38:07ID:???
>>575
早速レスして頂いてありがとうございます。
配列で返すとは思いつきませんでした。まだまだ知らないことだらけです(汗
教えて頂いたことを試してみます、どうもありがとうございました☆
057757405/01/05 00:13:08ID:???
試したらうまいこと出来ました、ありがとうございました☆

勢いでもう一つ質問してしまいますが、複数の配列を返したい場合はどうしたら良いでしょうか?(とりあえず同じように試したらダメでした)
調べてみた所、リファレンスを使って返すとあったのですが、それが最良の方法でしょうか? ↓こんな感じで・・・。

sub foo {
return \%hash, \@array;
}

いろいろ聞きまくってしまって申し訳ありませんが、よろしくお願いいたします。
0578nobodyさん05/01/05 00:15:45ID:???
ちょっとした質問です。
13 <= $teens && $teens <= 19
という評価式はなんだか冗長なのでもっと見やすくすることはできませんか?
$teens == 13 .. 19 くらい簡単に書けてもいいような気はするのですが。
0579nobodyさん05/01/05 01:25:20ID:???
>>577
一緒くたにしたあと長さで分離する手もあるにはあるが
普通はリファレンス使うのが良いと思う

>>578
perl 6 になるとなんかその手の書き方ができるようになると聞いたが
今のところは我慢しる
0580nobodyさん05/01/05 02:10:00ID:V9sS6I44
質問させてください。
現在9個の要素が入っている配列@arrayの0から4までの要素を
my ($a, $b, $c, $d)にいれて、コピーした要素を配列から消去
したいのですが、スマートな方法はありませんか。
my ($a, $b, $c, $d) = shift @array;感じとしてはこんな風に・・・

よろしくお願いします。
058158005/01/05 02:14:50ID:V9sS6I44
↑ごめんなさい、0から3です。
0582nobodyさん05/01/05 02:16:38ID:???
>>577
調べろ

sub a {
 my %hash = ( a => 1, b => 2 );
 my @array = ( "a", "b", "c" );
 my $ref = [ \%hash, \@array ];
 return $ref;
}
■ このスレッドは過去ログ倉庫に格納されています