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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん2010/06/05(土) 21:11:10ID:???
Perlのコーディングで困ってる人のスレです。

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

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

最低でも1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

お勧めサイトは >2 以降

前スレ http://pc11.2ch.net/test/read.cgi/php/1251989472/
0151nobodyさん2010/09/15(水) 07:35:37ID:???
本当の初心者なら文字コードより危険な入力を弾く勉強が先だと思うけど

その点英語圏は楽でいいよなー
0152nobodyさん2010/09/15(水) 08:52:32ID:jrRD4zmE
英語圏はいいよなー
0153nobodyさん2010/09/15(水) 10:56:10ID:FawmhmXv
すいませんフォームから送信されたPOSTとGETを取得することはPerlではどのように書くのでしょうか?
PHPだと$_GETと$_POSTで出来るのですがPerlではどのように書くのでしょうか?
0154nobodyさん2010/09/15(水) 11:57:40ID:???
use CGI;
my $m = new CGI;
my $name = $m->param('name');
0155nobodyさん2010/09/15(水) 13:38:01ID:5exFybXu
use strict;
してて$var001、$var002、・・・$var850 くらい変数があります。

スクリプトのはじめに

our $var001;
our $var002;
our $var003;
 ・
 ・
とか
my ($var001,$var002,$var003・・・)

みたいなことを書かないといけないのですが、

これをまとめて一括で定義する方法があれば教えてください。

0156nobodyさん2010/09/15(水) 13:43:17ID:???
配列使え
01571552010/09/15(水) 13:49:49ID:5exFybXu
コードはすでに書いてしまって
あとから、「あ”、しまった!」ってなってます。orz
0158nobodyさん2010/09/15(水) 13:49:52ID:???
my @var
my %var
0159nobodyさん2010/09/15(水) 13:59:12ID:???
printf '$var%03d,', $_ for 1..850;
0160nobodyさん2010/09/15(水) 14:12:01ID:???
今日はにぎやかだなここw
0161nobodyさん2010/09/15(水) 14:21:16ID:q2N7SUAH
みんな難しいことやってんだなあ。
0162nobodyさん2010/09/15(水) 14:30:47ID:???
>>155
そういうプログラムなら、
my $var001;
my $var002;
my $var003;

とあえてずらっと書いておいた方が、この後のコードを読むの覚悟しろと宣言しているようでかえってよいかと。
タイプするのが大変というなら、Excelで my $var001; という値を入れて、あとは850行分ドラッグすれば一気に作れるよ。
宣言だけで850行…
それに、同じ悩むなら、すでに書いたコードを直した方がよいよ。それこそperlで置き換えてみれば?
s/\$var(\d{3})/\$var\[$1]/g;
そうすれば、my @var; でok\(^o^)/
スカラー変数を宣言できたところで、どっちみちpushやshiftやspliceのような操作はできないしね。
0163nobodyさん2010/09/15(水) 14:32:00ID:???
perl難しすぎる
サニタイズの方法がわからん
0164nobodyさん2010/09/15(水) 14:39:17ID:???
適当

sub sanitize{
$html = shift;

$$html =~ s/&/&/g;
$$html =~ s/</</g;
$$html =~ s/>/>/g;
$$html =~ s/"/"/g;
$$html =~ s/'/#&39;/g;

return 0;
}
0165nobodyさん2010/09/15(水) 14:39:34ID:q2N7SUAH
ねえねえ、配列の初期化って()意外は駄目なんだね。

@hairetu = '';



@hairetu = "";

も、$hairetu[0] に空欄?が入っちゃうのね。
正解は

@hairetu = ();

だた。
配列の初期化(空欄化)って他にどうしてる?
0166nobodyさん2010/09/15(水) 14:42:09ID:???
undef
0167nobodyさん2010/09/15(水) 14:43:14ID:???
そりゃ左辺が配列型なのに、右辺がスカラー型だったらダメだろう


ホントにぎやかだねw
0168nobodyさん2010/09/15(水) 14:46:02ID:???
集合とか考えると初期化はφ=空集合=()を代入するだろJK
0169nobodyさん2010/09/15(水) 14:46:19ID:q2N7SUAH
>>167
そういやそうだなw
しかし、皮肉交じりに人をバカにするその口調は会社でも同じなのか?
だとしたら相当に嫌われてるぞおまえ。
0170nobodyさん2010/09/15(水) 14:48:59ID:???
もう少し勉強した方がいいってことですよ:-)
0171nobodyさん2010/09/15(水) 14:52:23ID:???
一理あるな。
0172nobodyさん2010/09/15(水) 14:54:17ID:???
おれが入門時に読んだ参考書には new が全く使われてなかったんだけど、
これはどういう概念なんだろうか?
これこそ初期化?
0173nobodyさん2010/09/15(水) 15:01:44ID:???
インスタンス作成
0174nobodyさん2010/09/15(水) 15:14:26ID:q2N7SUAH
もそっとわかりやすく。
いよ!色男!
0175nobodyさん2010/09/15(水) 15:18:27ID:???
クラス名(めい)とリファレンスを関連(かんれん)付(づ)けたものを返(かえ)すメソッドだよ
わかったかな
0176nobodyさん2010/09/15(水) 15:35:04ID:???
>>165
$#hairetu = -1;
0177nobodyさん2010/09/15(水) 16:11:27ID:???
perl だとさオブジェクト作成とかよりも、普通に関数作ってくだけで問題無いだろw
0178nobodyさん2010/09/15(水) 16:50:47ID:???
モジュール化すると再利用がきくからな
0179nobodyさん2010/09/15(水) 17:06:18ID:???
ってか、Perlにおいて new は只のサブルーチンだし・・
0180nobodyさん2010/09/15(水) 17:12:15ID:???
コンストラクタとして定義したサブルーチンだろ
ただのサブルーチンという言い方はおかしい
0181nobodyさん2010/09/15(水) 21:27:04ID:st8PUYRk
>>175
すまん。おれカタカナだめなんだよ。
0182nobodyさん2010/09/15(水) 22:56:34ID:???
> コンストラクタとして定義したサブルーチンだろ
> ただのサブルーチンという言い方はおかしい

new という名前だと何か意味あるっけ?
0183nobodyさん2010/09/15(水) 22:58:17ID:???
慣習的にコンストラクタにはnewと名付けるんだが
0184nobodyさん2010/09/15(水) 23:04:45ID:???
名付けたところで、ただのサブルーチンでしょ。
0185nobodyさん2010/09/15(水) 23:10:38ID:???
コンストラクタと定義したサブルーチンだと何度言ったら(ry
0186nobodyさん2010/09/15(水) 23:31:49ID:???
どこにそんな定義があるの?
0187nobodyさん2010/09/15(水) 23:45:34ID:???
はいはい
0188nobodyさん2010/09/16(木) 01:49:39ID:???
Perlでコンストラクタたりえるのは、定義した関数(サブルーチン)内で
blessされたリファレンスを返すからであって、他言語のように"new"自体は
言語構造でもなければ組込みの関数とかでもないでしょう。
0189nobodyさん2010/09/16(木) 09:18:22ID:???
言い方だけの問題だからどうでもいいよ...
0190nobodyさん2010/09/16(木) 10:28:19ID:???
Perlが生き残れるかはこのスレのサポートにかかっている
0191nobodyさん2010/09/16(木) 10:35:40ID:???
Perlって、そんなヤバい状況なんですか?
0192nobodyさん2010/09/16(木) 11:29:04ID:???
perlのバッチ処理で、
回線の負荷を5分間隔で
調べたいのですが、
方法はありますでしょうか?

当方、光でインターネットに
つながっています。
0193nobodyさん2010/09/16(木) 11:36:36ID:???
回線の負荷というのは何を指すの
0194nobodyさん2010/09/16(木) 11:43:36ID:???
5分毎にパケット通信量を取得して前回の通信量と比較する
0195nobodyさん2010/09/16(木) 12:05:16ID:???
問題設定がおおざっぱ過ぎるな。方法はあるよ。

もう少し自分の頭で考えてちゃんと作ってみてどうしてもわからない
ところをピンポイントで聞かないとこういうとこでは役に立つ回答は
つきにくい。

でもそんなのいろいろあるから自前で作ることにこだわらず拾って
きて使えばいいんじゃね? mrtgとかmuninとかcactiとか。
0196nobodyさん2010/09/16(木) 12:12:05ID:???
>>193-195

漠然としすぎていました。
失礼しました。

現在、MRTGのグラフで「回線の負荷」と称して、下記の方法でトレンドを見ています。
・自プロバイダ(@nifty)のHPスペースに1MBのファイルのアップロード・ダウンロードを
 行い、その所要時間をMRTGでグラフ化しています。


で、この方法が正しい考えなのか否か、また、こういう良い方法があるよ
という参考意見がありましたら、レスをお願いします。
0197nobodyさん2010/09/16(木) 12:18:01ID:???
それperlと何の関係もないじゃん。どこが適切かは俺もわからんので
案内はできんけど。

考え方的にはわからんでもないな。量的に許される程度なのかどうかは
個別の事情だし。
0198nobodyさん2010/09/16(木) 16:37:33ID:???
回線の状況を調べようとしてるのに、自らが回線を占有しちゃ意味無いだろ。
mrtg には通信した容量とかも記録されてるから (しかも時間ごとに) そのログを活用したほうがいいかと

とりあえず mrtg のログ漁りから始めた方よいかと


定期的にまわすなら cron (Windows 鯖ならタスク) でチェックするスクリプトを走らせればいいかと思う


どう〜しても何をやっていいのか分からなければ
http://hibari.2ch.net/test/read.cgi/unix/1126361848/l200
0199nobodyさん2010/09/17(金) 00:19:38ID:???
>>198
レスありがとうございます。

そうなんですよね。
前は10Mでトレンドを取っていたのですが、
本末転倒なので、1Mに変えた次第です。
0200nobodyさん2010/09/17(金) 08:57:37ID:???
経路の途中の混み具合を知ろうと思うと実際に取って見るぐらいしか
方法はないんだよな。途中の通信業者からトラフィック測定データを
もらえるようなコネでもない限り。
0201nobodyさん2010/09/17(金) 09:05:32ID:???
traceroute の結果で経路の混み具合は分かるじゃん
02021922010/09/17(金) 13:56:22ID:???
今日からなぜか、put,getコマンドで所要時間が出力されないようになりました。
@niftyさん、なにか変えたのでしょうか。。。
ということで、tracerouteも含め別の方法を考えてみます。
0203nifty2010/09/17(金) 14:19:02ID:???
ぼくのせいにするのやめて
0204perl初心者2010/09/17(金) 14:19:08ID:vsIN50JT
メールフォームに添付ファイルを付けて処理しようとしたら、can't build entity: no body, and not multipartというエラーが出ます。
添付ファイルの処理を加える前は正常に動作していました。
他のページで同じ質問にあぽーんでかたずけられてましたが、どなたかご教示頂ければ幸いです。
よろしくお願い致します。

※環境(参考情報)
CentOS Apache
perl5.8.8
use Net::SMTP;
use Encode;
use MIME::Entity;
use CGI;
送信フォームのエンコード:utf8
cgiのエンコード:なぜかiso-2022-jp
0205nobodyさん2010/09/17(金) 14:37:51ID:???
Perl使える方でRubyかPythonも使える方にお伺いします
今からやる場合、どれがいいですかね?
用途はコマンドラインから動かすのとCGI利用です
0206nobodyさん2010/09/17(金) 15:41:49ID:???
>>204
ソース見てないので何ともいえんが
MIME::Entityにファイルデータが渡ってない・・に1票

おいらなりの流れ

1.添付データは、useCGI;のVars()でなく、param()で取得
2.取得したデータをmimeエンコード
3.メールヘッダ&本文をテキストベースで整形して
4.本文をboundaryでブロック分け
5.boundaryの1ブロック目は本文を挿入
6.2つめのboundaryブロックは、mimeタイプ&ファイル名を宣言して、
 3)でエンコードしたテキストを貼付け
7.出来上がったメールをsendmalに投げて送信


>>205
onRailが最も流行ってるって観点からだとRubyかな

Perlは一通りなんでもできるけど、
Perl6も出たばっかだしニーズ的に今後どうなるかわからん。

勉強する環境で考えると日本語の教材も多くサンプルも多いperlになる。
PHPも同じこといえる
どっちもレガシーになりつつあるけどね。
0207perl初心者2010/09/17(金) 15:49:22ID:vsIN50JT
今、httpdのエラーログを見たら、下記の通りでした。

MIME::Body::File->open FileName.jpg: No such file or directory at /usr/lib/perl5/site_perl/5.8.8/MIME/Body.pm line 435.,
referer: http://localhost/******/****/form_mail.html
0208nobodyさん2010/09/17(金) 16:09:32ID:???
>>207
添付ファイルを一旦サーバー上に保存せんとダメ

だから
open FileName.jpg: No such file になる

メール送信後に削除ね。
0209nobodyさん2010/09/17(金) 16:14:59ID:???
>>207
スクリプト2行目に
use CGI::Carp qw(fatalsToBrowser);

の1行かいたら、わざわざエラログ見なくて済む。
0210perl初心者2010/09/17(金) 16:15:05ID:vsIN50JT
ご回答ありがとうございます。
たしかに我ながらアポーンな痛い愚問でした。
0211nobodyさん2010/09/17(金) 17:02:13ID:???
あぽーんて
0212nobodyさん2010/09/17(金) 17:31:13ID:???
まともなプログラム書くならお好みでってとこだけど、
コマンドラインでワンライナー限定だとperl最高だと
思う。慣れもあると思うが。
0213nobodyさん2010/09/17(金) 19:21:26ID:???
perl はサンプルは一杯あるけど、自分で試行錯誤しようとする気持ちがないと
クソサンプルの餌食になってしまうよ

1つのやり方に色んなやり方あって柔軟だとは思うけど、初心者には迷うだけなんだよねw
0214nobodyさん2010/09/17(金) 19:38:09ID:???
>>213
日本語でおk
0215nobodyさん2010/09/17(金) 19:40:23ID:???
Perlが読めればいろんなCGIスクリプトが読めるわけでうらやましい
0216nobodyさん2010/09/17(金) 19:40:52ID:???
もしかしてお前読めないの?
0217nobodyさん2010/09/17(金) 21:52:11ID:???
>>214
ちしょうはチンコでも吸ってろ
って意味
0218nobodyさん2010/09/18(土) 14:29:16ID:???
今では、フォームの受け取りに

my $query = CGI->new;
*in = $query->Vars();

って、たった2行で書くようになってるけど、
昔みたいに、

if ($ENV{'REQUEST_METHOD'} eq "POST") {
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
@pairs = split(/&/,$buffer);
for $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/\t//g;
$in{$name} = $value;
}
} else {
$buffer = $ENV{'QUERY_STRING'};
@pairs = split(/&/,$buffer);
for $pair (@pairs) {
($name, $value) = split(/=/, $pair);
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ s/\t//g;
$in{$name} = $value;
}
}

って書いたほうが、
素人からは何やってるかが書かれている分、良いように思う。
0219nobodyさん2010/09/18(土) 17:41:29ID:???
あっ、そう
0220nobodyさん2010/09/18(土) 17:57:39ID:???
仕組みなんて分からなくていいんだよ
ブラックボックスでおk
0221nobodyさん2010/09/18(土) 23:52:38ID:???
inとか使ってる奴はcgi-lib.pl時代の亡霊
0222nobodyさん2010/09/19(日) 15:20:57ID:???
ライブラリに入ってるコード毎回コピペするのかよw
0223nobodyさん2010/09/19(日) 16:24:14ID:???
写経だよ写経。
悟りが啓けるだろ。
0224nobodyさん2010/09/19(日) 17:09:11ID:???
何かバグってるときライブラリならアップデートが楽なのに、
あらゆるプロジェクトを書き直すのか。ご苦労さんってこった。
0225nobodyさん2010/09/19(日) 23:22:09ID:ND7IF1JX
>>218

my $query = CGI->new;
*in = $query->Vars();

の二行をわかりやすく説明してくれたらどんなに感謝することか。(;´Д`)
0226nobodyさん2010/09/20(月) 01:01:04ID:???
>>225
http://search.cpan.org/dist/CGI.pm/lib/CGI.pm#FETCHING_THE_PARAMETER_LIST_AS_A_HASH:
http://perldoc.jp/docs/modules/CGI-3.49/CGI.pod

二行目は真似せず素直に %in = $query->Vars; とした方がいい。
0227nobodyさん2010/09/20(月) 12:16:11ID:???
おーー!
1行になったw
0228nobodyさん2010/09/20(月) 12:19:01ID:???
( ゚д゚ )
0229nobodyさん2010/09/20(月) 12:30:44ID:???
> の二行をわかりやすく説明してくれたらどんなに感謝することか。(;´Д`)

それこそソース嫁。
0230nobodyさん2010/09/20(月) 12:33:54ID:???
>>224
プロジェクト書き直すのにお金が発生するって前提だと
ある意味、悪いことではないかも

新言語がリリース→新言語でソフト開発→普及する→追加機能のニーズ
→車輪の再開発→開発案ネタ切れ→仕事がなくなる→誰にも見向きされなくなる
→ちょっと使いやすくした新言語をリリース→新言語でソフト開発→普及する
→追加機能のニーズ→車輪の再開発→開発案ネタ切れ→仕事がなくなる
→誰にも見向きされなくなる

プログラミング市場とは、ちょうどウィルスとウィルス対策ソフトの関係のように
イタチゴッコな構造でなければ繁栄しない。
0231nobodyさん2010/09/20(月) 12:41:55ID:???
my @List = WorkA -> WorkB

の「->」の意味ってそもそもどんな意味?

WorkAをWorkBに任せる?

それとも

オブジェクト指向的に
@List.WorkA.WorkB;

ってこと?
0232nobodyさん2010/09/20(月) 13:15:25ID:???
WorkAのWorkBを@listに代入する
0233nobodyさん2010/09/20(月) 16:07:19ID:???
>>230
どこから新言語の話が出てきたの?
0234nobodyさん2010/09/20(月) 22:53:46ID:???
新言語にリプレースしないからといって脅威が発生するわけでもないのに
0235nobodyさん2010/09/21(火) 05:32:11ID:???
workAオブジェクトの属するクラスで呼び出せるworkBを呼び出す。
workBはリストを返すので代入する。
0236nobodyさん2010/09/21(火) 08:10:37ID:???
>>231
http://perldoc.perl.org/perlop.html#The-Arrow-Operator
http://perldoc.jp/docs/perl/5.12.1/perlop.pod

a. 右辺が [Num] なら左辺を配列リファレンスと看做し、添え字 Num の値を返す。
  右辺が {Key} なら左辺をハッシュリファレンスと看做し、キー Key の値を返す。
  右辺が (Args) なら左辺をコードリファレンスと看做し、Args を渡して呼び出す。

my $ref = bless [qw( foo bar baz )], 'Foo';
print $ref->[1]; # bar
print { a => 'Foo', b => 'Bar', c => 'Baz' }->{'b'}; # Bar
sub { print join '-', @_ } -> (0..2, 'a'..'c'); # 0-1-2-a-b-c

b. 左辺がクラス(パッケージ)名かそれを収めたスカラー変数なら、右辺にはそのクラス
  から辿れるサブルーチン名かそれを収めたスカラー変数、又はコードリファレンスを
  収めたスカラー変数を置ける。この場合、右辺のサブルーチンには左辺が第1引数と
  して渡される。他の引数は (...) を続ける事で渡せる。

sub Foo::foo { print map("[$_]", @_), "\n" }
my $bar = sub { print 'Bar:', map("[$_]", @_), "\n" }; # パッケージに依存しない
my($Baz, $baz) = ('Foo', 'foo');

Foo->foo, $Baz->foo, Foo->$baz; # [Foo]\n[Foo]\n[Foo]\n
Foo->foo('quux'), $Baz->$baz('quux'); # [Foo][quux]\n[Foo][quux]\n
Foo->$bar, $Baz->$bar('quux'); # Bar:[Foo]\nBar:[Foo][quux]\n

c. 左辺が bless されたリファレンスなら、bless されたクラスを元に b. 同様の動作
  をする。第1引数にはクラス名でなくリファレンス自身が渡される。

$ref->$baz('quux'); # [Foo=ARRAY(0xhhhhhh)][quux]
02372312010/09/21(火) 10:22:02ID:???
>>235,>>236
なるほど、ありがと!
ドキュメントあったのね。

グーグルで「perl ->」で検索できなかったら
ドキュメントが探せないってのは痛いなぁ。

googleは、「->」の文字列が無視されてしまう。
0238nobodyさん2010/09/21(火) 18:44:47ID:???
Perl アロー演算子
0239nobodyさん2010/09/21(火) 19:16:06ID:???
検索で困る人が多そうなのはたいてい perlop か perlvar の
どっちかに載ってる傾向があるような気がする。
0240nobodyさん2010/09/22(水) 01:11:34ID:AC22vKYS
1: 自分はこういう事がしたい。
  index.htmlのプルダウンメニューで「あ」を選択すると、value="01"がchoice.cgiに渡されて
  http://www.ほげ.jp/a/ に飛ぶようにしたい。
2: それでこんな風にやってみたが・・・
  index.htmlとchoice.cgiは下に記載。
3: こんなエラーが出て上手く行かなかった。
  choice.cgiの数値を$page08ぐらいまで作ると500 Internal Server Errorを吐き出して停止する。
  これを$page08、$page09と数値を増やしても、しっかり動くようにできませんか?

index.html

<form action="choice.cgi" method="GET">
<select name="choice" onchange="this.form.submit();" size="10" style="width: 200px;">

<option value="01">あ</option>
<option value="02">い</option>
<option value="03">う</option>
<option value="04">え</option>
<option value="05">お</option>
<option value="06">か</option>
<option value="07">き</option>
<option value="08">く</option>
<option value="09">け</option>
<option value="10">こ</option>
<略>
</select>

</form>
0241nobodyさん2010/09/22(水) 01:12:47ID:AC22vKYS
choice.cgi

#!/usr/bin/perl
$page01 = "http://www.ほげ.jp/a/";
$page02 = "http://www.ほげ.jp/i/";
$page03 = "http://www.ほげ.jp/u/";
$page04 = "http://www.ほげ.jp/e/";
$page05 = "http://www.ほげ.jp/o/";
$page06 = "http://www.ほげ.jp/ka/";
$page07 = "http://www.ほげ.jp/ki/";
$page08 = "http://www.ほげ.jp/ku/";
$page09 = "http://www.ほげ.jp/ke/";
$page10 = "http://www.ほげ.jp/ko/";
<略>
$jump = "http://www.ほげ.jp/";#変な値が入力された時に飛ぶURL

$query = $ENV{"QUERY_STRING"};
($key,$value)= split(/=/,$query);

if($value == 01) {$jump = $page01;}
elsif($value == 02) {$jump = $page02;}
elsif($value == 03) {$jump = $page03;}
elsif($value == 04) {$jump = $page04;}
elsif($value == 05) {$jump = $page05;}
elsif($value == 06) {$jump = $page06;}
elsif($value == 07) {$jump = $page07;}
elsif($value == 08) {$jump = $page08;}
elsif($value == 09) {$jump = $page09;}
elsif($value == 10) {$jump = $page10;}
<略>
print "location: $jump\n\n";
exit;
0242nobodyさん2010/09/22(水) 01:39:35ID:???
世の中には8進数というものがあってだな。
0243nobodyさん2010/09/22(水) 01:39:54ID:???
>>240
> $page08ぐらいまで作ると500 Internal Server Errorを吐き出して停止する。
それは君が書き損なっているからだ。
下のように2行付け加えて、出てくるエラーメッセージを読みなさいな。

#!/usr/bin/perl

#!/usr/bin/perl
use CGI::Carp qw(fatalsToBrowser);
use warnings;

これらの説明は以下。
http://search.cpan.org/dist/CGI.pm/lib/CGI/Carp.pm
http://perldoc.jp/docs/modules/CGI-2.89/CGI/Carp.pod
http://perldoc.perl.org/warnings.html
http://perldoc.jp/docs/perl/5.8.1/warnings.pod
0244nobodyさん2010/09/22(水) 01:45:55ID:???
> elsif($value == 08) {$jump = $page08;}

書き損なうも何もここで Illegal octal digit 出るだろ
0245nobodyさん2010/09/22(水) 02:51:53ID:???
08 は八進数っていう認識になっちゃうから

数字で扱うならアタマに 0 は付けないように。


でも文字列として扱った方が何かと楽なので、
elsif($val eq '08')〜
とした方が良いかと
0246nobodyさん2010/09/22(水) 02:55:05ID:???
if($value eq '01'){ $jump = $page01; }
elsif($value eq '02'){ $jump = $page02; }
elsif($value eq '03'){ $jump = $page03; }
elsif($value eq '04'){ $jump = $page04; }
elsif($value eq '05'){ $jump = $page05; }
elsif($value eq '06'){ $jump = $page06; }
elsif($value eq '07'){ $jump = $page07; }
elsif($value eq '08'){ $jump = $page08; }
elsif($value eq '09'){ $jump = $page09; }
elsif($value eq '10'){ $jump = $page10; }
<略>
print "location: $jump\n\n";
exit;
0247nobodyさん2010/09/22(水) 03:15:38ID:???
正規表現でカッコにマッチしたのは $1、$2、$3、…に格納されますが、
これらをまとめて取り出すための特殊変数とかありますか。
「perl 特殊変数」でぐぐっていくつかページを読んだのですが、
それらしい特殊変数がみつかりませんでした。
0248nobodyさん2010/09/22(水) 03:34:18ID:???
use strict;
use warnings;

my $str = '今日は暑かったかもしれない。 しかし今日と違って明日は寒いようだ。 今日はお買い物に行った。';
my @test = $str =~ /今日.*?っ/gi;
print join("\n", @test);

0249nobodyさん2010/09/22(水) 03:44:24ID:???
>>248
ありがとうございます。
while文との組み合わせでも動くでしょうか。
ためしたとろ、無限ループになるようです。
my @x;
while (@x = $str =~ /¥w+/g) { print Dumper(¥@x); } # 無限ループ?
0250nobodyさん2010/09/22(水) 04:34:43ID:???
for my $str ( @str ){
if( my @x = $str =~ /\w+/g ){
print Dumper( \@x );
}
}
0251nobodyさん2010/09/22(水) 05:38:12ID:???
use strict;
use warnings;

my $str = '今日は暑かったかもしれない。 しかし今日と違って明日は寒いようだ。 今日はお買い物に行った。';
my @test = $str =~ /今日.*?っ/gi;

print "文字列:$str\n";

print "_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/\n";
print "foreach を使う場合の一例\n";
foreach my $regex (@test){
print "取得したのは : $regex\n";
}

print "_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/_/\n";
print "while を使う場合の一例 \n";
my $str_bak = $str; # 削除しながら取得するため、バックアップをとる
while($str =~ s/(今日.*?っ)//){
print "取得したのは : $1\n";
}
$str = $str_bak; # バックアップを戻す
■ このスレッドは過去ログ倉庫に格納されています