くだすれPerl(超初心者用)3
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2009/03/31(火) 22:20:27ID:???もしくは質問者自身何が何だが分からない質問を勇気を持って書き込むスレッドです。
Perl使いが優しくコメントを返しますが、
お礼はPerlの布教と初心者の救済をお願いします。
前スレ
くだすれPerl(超初心者用)2
http://pc11.2ch.net/test/read.cgi/php/1204488452/
関連スレ
Perlについての質問箱 39箱目
http://pc12.2ch.net/test/read.cgi/tech/1234181856/
Perlコーディング初心者質問スレ Part 59
http://pc11.2ch.net/test/read.cgi/php/1234752149/
【Perl上級者コーナーPart01】
http://pc11.2ch.net/test/read.cgi/php/1024741312/
0178nobodyさん
2009/07/26(日) 00:42:20ID:J3wl39Kv今日もネタもないのにageてやるからな!
 ̄ ̄∨ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
∧_∧ ∧_∧ age
(・∀・∩)(∩・∀・) age
(つ 丿 ( ⊂) age
( ヽノ ヽ/ ) age
し(_) (_)J
0179nobodyさん
2009/07/29(水) 22:19:43ID:???CGI(Perl)を使って外部のサイトからHTMLソースを取り込むにはどうしたら良いでしょう?
外部サイトのデータから統計を取って、データとして出力するようなCGIが書高と思ってます。
0181nobodyさん
2009/07/29(水) 22:25:45ID:???0182nobodyさん
2009/07/29(水) 22:46:06ID:???知らないなら、「わかりません」って言えよ
0185179
2009/07/30(木) 01:23:24ID:???ありがとうございます。
0186nobodyさん
2009/08/04(火) 17:31:46ID:opJYW1lj文字化けする文字をこのように変えたいのですが変換されません。
どのように書けばいいのでしょうか。
$a =~ s//高/g;
よろしくお願いします。
0187nobodyさん
2009/08/04(火) 18:22:15ID:???0188nobodyさん
2009/08/04(火) 18:46:13ID:Udgymmfyが文字化けするので高に変えたいってこと?
0189nobodyさん
2009/08/05(水) 08:42:09ID:57ai1vyR0190nobodyさん
2009/08/05(水) 10:00:37ID:2mkcb2/Uありがとうございます。
>>188
はい、そのようにしたいと考えております。
187さんのおっしゃる通りに、書いてるコードを確認したところEUCでしたので
sjisに変えてみたところ、うまくできました!
ここ数日、悩んでいたのですっきりしました。
187さん、188さん、ありがとうございました。
0191nobodyさん
2009/08/05(水) 20:48:29ID:???任意の文字で囲まれた
文字列をすべて抽出する方法がわかりません。
たとえば、abcabcabcといった文字列に対し
aとcで囲まれたすべての文字列を取得するには
どうすればいいのでしょうか?
この例だと
abc
abcabc
abcabcabc
abcabc
abc
が該当します。これらをすべて抽出したいのですが。
0192nobodyさん
2009/08/05(水) 21:27:00ID:???while($str =~ m/(a)/g){
my $pos = pos($str);
my $result = $1;
while($str =~ m/([^c]*c)/g){
$result .= $1;
print "$result\n";
}
pos($str) = $pos;
}
0193191
2009/08/06(木) 09:27:03ID:???>>192さん ありがとうございました。
思っていたように動作しました。
続けての質問で申し訳ないのですが
アルファベットで構成されるランダムな文字列
CFGTARFEQZCAZVHNNNGZYAKLOPYL..(みたいな感じです)
から例えば、Aから始まり X,Y,Zを中に含まず XまたはYまたはZで終わる
文字列をすべて抽出するには
どのようにすればよいのでしょうか?
実際には単一のアルファベットの連続ではなく
ONETWOTHREEFOURFIVE..のように
単語が適当に連続しているものと想定して使用できる記述を
(ONEで始まりSIXを含まずTENで終わり のように)
提案していただけると助かります。
よろしくお願いします。
0194191
2009/08/06(木) 09:38:23ID:???単語はONE,TWO,THREE,FOUR,FIVE,SIX,SEVEN,EIGHT,NINE,TENが想定される
のように、あらかじめ分かっていて指定することができます。
0195nobodyさん
2009/08/06(木) 15:43:26ID:0zj+bmfk0196nobodyさん
2009/08/06(木) 23:46:37ID:???sub start {
my ($item, $sub) = @_;
return sub{
my ($str) = @_;
my $start = 0;
while((my $new = index($str, $item, $start)) >= 0){
$start = $new+length($item);
$sub->(\$str, $start, length($str), $item);
}
};
}
sub without {
my ($item, $sub) = @_;
return sub{
my ($str, $start, $end, $result) = @_;
my $new = index(${$str}, $item, $start);
$end = $new if ($new >= 0 && $new < $end);
$sub->($str, $start, $end, $result);
};
}
0197nobodyさん
2009/08/06(木) 23:47:37ID:???my ($item) = @_;
return sub{
my ($str, $start, $end, $result) = @_;
while(1){
my $new = index(${$str}, $item, $start);
($new >= 0 && $new < $end) or last;
$result .= substr(${$str}, $start, $new+length($item)-$start);
$start = $new+length($item);
print "$result\n";
}
};
}
my $str = join('', map{
qw(ONE TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN)[int(rand(10))]
} (1..100));
print "$str\n\n";
start('ONE', without('SIX', end('TEN')))->($str);
0198191
2009/08/07(金) 00:23:46ID:???動作検証し、勉強させていただきます。
複数のファイルから質問のようなことをしたくて
テキストエディタでの単純な正規表現での処理だと面倒なので
やったこともないプログラミングのようなことをを試みたのですが
単純なマッチングでは、オーバラップしているところが
検索から漏れて困ってました。
0199196
2009/08/07(金) 01:07:13ID:???終わりの条件を複数にするのを忘れてたけど、
$subを配列にしてループさせると、探索条件を複数にすることもできると思う。
0200nobodyさん
2009/08/07(金) 01:34:42ID:???是非わが社に(笑)
掲示板見てると出来る人そこそこいるのにperl経験者募集かけても全然こないのは
年寄りが多いのか…若くてもそこそこの地位になってるのか…
正規表現あんまり自信ないですくらいなら許せるが
リファレンスもOOPもわかりませんって人多くて最近疲れ気味だ(泣)
0202nobodyさん
2009/08/07(金) 10:28:18ID:wZBhH2760203nobodyさん
2009/08/08(土) 08:08:10ID:nShQ5pki$b = "str$astr";だと最初の「str」で途切れるし
$b = "str$a str";にすると空白はいっちゃうし
0204nobodyさん
2009/08/08(土) 08:38:19ID:???"str$a\str"
0205nobodyさん
2009/08/08(土) 09:58:31ID:???0206nobodyさん
2009/08/10(月) 13:15:14ID:LPa3QqaE0207nobodyさん
2009/08/13(木) 09:14:17ID:NeVAVZeH受け取ったデータまんま返したいんです
環境変数を使い分けるの面倒だし
0210nobodyさん
2009/08/14(金) 16:39:29ID:???$str = "euc or shift-jis or utf8";
if ( $strに"euc"と"shift-jis"という両方の文字を含んでいたら ) {
・・・
{
0211nobodyさん
2009/08/14(金) 17:03:04ID:???優先順じゃないから気をつけて
で、正規表現つかってね
0212nobodyさん
2009/08/14(金) 18:29:29ID:???実直に書けば
$str =~ /(^.*euc.*shift-jis.*$)|(^.*shift-jis.*euc.*$)/
かな
後々にも条件文が続くなら
my %hash = map{ $_ => 1} split ' or ', $str;
if($hash{'euc'} and $hash{'shift-jis'}){
}
elsif($hash{'utf8'}){
}
...
とかどうよ
0214nobodyさん
2009/08/15(土) 09:36:01ID:njfakeIMそれでもいいので教えてください
0216nobodyさん
2009/08/18(火) 18:06:40ID:RO5+3AJ6あれなんとか出来ないの?
0217nobodyさん
2009/08/18(火) 18:29:11ID:???0218nobodyさん
2009/08/18(火) 18:30:34ID:???0219nobodyさん
2009/08/18(火) 18:53:46ID:RO5+3AJ60220nobodyさん
2009/08/19(水) 23:25:05ID:???0221nobodyさん
2009/08/20(木) 02:33:32ID:???0222nobodyさん
2009/08/21(金) 21:25:25ID:OnG1WZEr$s =~ /(.)/;
for($i=4; $i>0; $i--) {
print "$1\n";
$i =~ /(.)/;
}
↑これ実行すると「0321」となるはずなのに「0000」になるんだけど何で?
正規表現処理した後にプリント使うと「4321」になるけど、どうしてもこのまま使いたいです
0223nobodyさん
2009/08/21(金) 21:34:13ID:???print "$i\n";
$i =~ /(.)/;
}
0224nobodyさん
2009/08/21(金) 21:42:18ID:OnG1WZEr0226nobodyさん
2009/08/21(金) 21:44:13ID:???0227nobodyさん
2009/08/21(金) 21:49:31ID:???多分ループごとに $1 が変数スコープ外れてる
my $num = 0;
my $put;
$num =~ /(.)/;
$put = $1;
for(my $cnt = 4; $cnt > 0; $cnt--){
print "$put\n";
$cnt =~ /(.)/;
$put = $1;
}
これでいけるけど、もっといい書き方がきっとあるはず
具体的に何したいのかを書けばもっといいアドバイスがもらえると思うよう
あと一文字の変数を使うのと use strict しないのはよしといたほうがいいよ
落とし穴ハマってうっきーってなるから
と思ったけど実行結果 0321 なのな・・・ちょっと意味分からんわ
0228nobodyさん
2009/08/21(金) 22:33:56ID:???do{
$i =~ /(.)/;
print "$1\n";
$i = ($i-1) % 4;
}while($i > 0);
結果は出るけど、質問の意図が読めないからどうなんだろ。
0229nobodyさん
2009/08/21(金) 23:10:07ID:???for( my $i=4; $i>0; $i-- and print "$1\n" and $i =~ /(.)/ ) { }
0230nobodyさん
2009/08/22(土) 01:20:43ID:???$Nのスコープってどうなってんだ?
って質問なんじゃ?
0231nobodyさん
2009/08/22(土) 05:10:44ID:???$a = "[123][456][789]";
while($a =~ /[(.*?)]/){
print $1"\n";
}
123、456,789と表示したいです
一回ずつづらしてマッチさせられないですか?
0232nobodyさん
2009/08/22(土) 05:24:03ID:???1回ずつじゃないけど
$str = "[123][456][789];
@contents = $str =~ /[(.*?)]/g;
print "$_\n" foreach @contents;
0233nobodyさん
2009/08/22(土) 05:26:41ID:???正規表現もバグってるよ
$str = "[123][456][789]";
@contents = $str =~ /\[(.*?)\]/g;
print "$_\n" foreach @contents
0234nobodyさん
2009/08/22(土) 07:32:50ID:???my $s = "[123][456][789]";
while($s =~ /\G\[(.*?)\]/g){
print $1, "\n";
}
0235nobodyさん
2009/08/22(土) 07:41:35ID:???正規表現周りは奇妙だからなぁ。
たとえば、最後にマッチした正規表現を使う、空マッチを使うと期待通りに動く。
$1などの変数はマッチ直後に保存しとくのがベストだろうと思う。
my $s = 0;
$s =~ /(.)/;
for(my $i = 4; $i > 0; --$i){
print $1, "\n";
$i =~ //;
}
0237nobodyさん
2009/08/22(土) 09:07:20ID:???m//gで、前回マッチした直後からマッチングを行う。
my $s = "[123]456][789]";
こんなときに、処理を止める。
0239nobodyさん
2009/08/22(土) 09:48:08ID:???意味が分からん。
別に気に入らなければ、付けなきゃいいじゃん。
>>238
じゃあさ、>>231のシェバング行の -- が無くても同じ結果になるけど、
-- に意味があると思う?
0240nobodyさん
2009/08/22(土) 10:21:27ID:???正規表現で () 使った後に使える $n は、
正規表現使った時に my されると思った方が
いいかも知れません
0241nobodyさん
2009/08/22(土) 10:40:35ID:???$1の初期値が「0」ってことはないだろうし。
0242nobodyさん
2009/08/22(土) 11:10:48ID:???>>240の言葉を借りれば、グローバルなレキシカル変数$1(下の(1))と、forループ内で
$i =~ /(.)/;より下で有効なレキシカル変数$1の2つが混在していると。
$s = 0;
$s =~ /(.)/; #=> my $1 = "0" ・・・(1)
for($i=4; $i>0; $i--) {
print "$1\n"; "=> この時点では1つ上のスコープのグローバルな$1、すなわち(1)を表示
$i =~ /(.)/; #=> my $1 = $i ・・・(1)のグローバルなレキシカル変数$1は、一旦ここで見えなくなる
}
0243nobodyさん
2009/08/22(土) 12:04:28ID:???では、面白い例を。結果は0432。
my $s = 0;
$s =~ /(.)/;
foreach(reverse 1..4){
print $1, "\n";
/(.)/;
}
0245nobodyさん
2009/08/25(火) 18:13:21ID:???別に現状では何も問題が無いんですが、何の意味があるか良くわかりません。
if 文で変数が未定義だったら何をしているんでしょうか?
$stlist{$kumi}{$bangou}= [] if ! exists $stlist{$kumi}{$bangou};
0246nobodyさん
2009/08/25(火) 22:37:47ID:???use warnings;
my %stlist = ();
my $kumi = 1;
my $bangou = 2;
$stlist{$kumi}{$bangou} = 3;
$stlist{$kumi}{$bangou} = [] if ! exists $stlist{$kumi}{$bangou};
print $stlist{$kumi}{$bangou},"\n";
undef $stlist{$kumi}{$bangou};
$stlist{$kumi}{$bangou} = [] if ! exists $stlist{$kumi}{$bangou};
print $stlist{$kumi}{$bangou},"\n";
--
>perl test_perl.pl
3
Use of uninitialized value in print at test_perl.pl line 14.
0247nobodyさん
2009/08/25(火) 22:54:19ID:???$stlist{kumi}{bango} ||= [];
で同じことできるんだけどな
0249nobodyさん
2009/08/26(水) 09:57:20ID:???意味はモヤッと解ってきたのですが「[]」 の使い方が解らないんです。
「()」では駄目なんですか?
0250nobodyさん
2009/08/26(水) 18:52:28ID:mCRAV2Yd0251nobodyさん
2009/08/26(水) 21:01:17ID:???() 配列
[] 配列のリファレンス
ここで
$hoge = ();
とすると、多分スカラーコンテキストで無名配列が評価されるので0が入る
$hoge = [];
だと配列のリファレンスが入るから、何も値が入ってない状態で
$hoge->[0]
とかやってもうまく動く
多分ね
0252nobodyさん
2009/08/27(木) 02:29:49ID:???my $hoge = [1, 2, 3, 4, 5];
my $huga = [6, 7, 8, 9];
という風に二つの配列へのリファレンスがあったとして、
この二つの配列を合わせた配列へのリファレンスを新しく作るには
my $kei = [ @{$hoge}, @{$huga} ];
以外に方法はありますか?
いろいろ試してみたんですが上手くいかなくて…。
0253nobodyさん
2009/08/27(木) 05:43:28ID:???regular expression
オレオレスクリプト以外に使用厳禁↓
http://search.cpan.org/dist/String-Scanf-2.1/lib/String/Scanf.pm
>>251
undefがはいるよぉぉぉぉぉぉ。
>>252
考えすぎるとハゲるぞ。
おめーら、クソスレより初心者スレ使えよ。
0254nobodyさん
2009/08/28(金) 10:14:29ID:???してるんだけど, 一緒に要求される DBI::DB2 が入らない.
ubuntu 8.04 用の DB2 deb パッケージを入れたあと
$ sudo su
# export DB2_HOME=/opt/ibm/db2exc/V9.5
# cpan DBI::DB2
すると, include するべきヘッダが無いらしく, 大量の未宣言エラーが出る。
DB2 自体をソースからコンパイルして make install するしか無いかな?
というか DB2 は使う予定が無いから, DBI::DB2 自体をスルーしたいのだけど...
ちなみに CPAN-Testers でもインストール成功例は無いようです.
ttp://static.cpantesters.org/distro/D/DBD-DB2.html
0256254
2009/08/28(金) 13:30:37ID:???それでですね...
ずらずら出るエラーメッセージを見ていたら, include 出来ずにエラー出してるのは
DBIXS.h とかだったので, cpan DBI してみたらビンゴ.
無事 DBD::DB2 のインストールに成功しました.
しょうもないオチですまんかった. 付き合ってくれた >>255 ありがとう.
0257nobodyさん
2009/08/31(月) 21:28:16ID:SNcF+RG0if ($r =~ /str/){exit;}
↑マッチしたら偽判定にするにはどうしたらいいの?
0258nobodyさん
2009/08/31(月) 21:28:57ID:SNcF+RG0$s="str"
if ($s =~ /str/){exit;}
0259nobodyさん
2009/08/31(月) 22:32:07ID:???0260nobodyさん
2009/09/01(火) 02:45:08ID:???0261nobodyさん
2009/09/04(金) 13:32:16ID:???if ($r !~ /str/){exit;}
if ( ! $r =~ /str/){exit;}
if (not $r =~ /str/){exit;}
unless($r =~ /str/){exit;}
すきなの使え。この条件ならunlessも!~もほとんど差がないと思うぞ。
0262nobodyさん
2009/09/04(金) 20:00:55ID:???どうすればいいでしょうか?戻るボタンや戻るボタンの過去の履歴を
押しても、最後にいたページにリダイレクトされるようにしたいんですが、
できるでしょうか?
0263nobodyさん
2009/09/04(金) 20:22:09ID:???つか毎回ログつくってしまうかクッキーで管理すればおk
0264nobodyさん
2009/09/05(土) 04:55:23ID:UpeEOLWycgi以外で
0265nobodyさん
2009/09/05(土) 06:08:28ID:???ていうかwperl知らんのけ
0266nobodyさん
2009/09/05(土) 06:30:25ID:UpeEOLWyありがとう
0268nobodyさん
2009/09/05(土) 12:52:13ID:???0269nobodyさん
2009/09/05(土) 14:46:03ID:???ありがとうございます。さっそくググって勉強中ですが、cakeやらsymfonyやら
あるようですが、私の用途ですと、どれを使っても問題ないでしょうか?
>>263
リダイレクト関連でheaderを勉強して、キャッシュが残らないように設定して、途中で
「戻る」と、問題がテスト開始前に設定した問題数分最初から出題されるように
なったので(同時にセッションも新規セッション)、20問なら20問後戻りせずに解かせる
という最低限やりたいことは、これで対処できるようになったかと思います。
>>262で質問した内容とはまだ少し違いますが。ありがとうございます。
0270nobodyさん
2009/09/06(日) 07:34:15ID:???cakeとかPHPだろ。とりあえずCatalyst使っとけ。他にもあるがCatalystは少し枯れてるし情報も豊富。
中規模以のアプリケーションを楽しく書きたいならフレームワーク一択。
0271nobodyさん
2009/09/06(日) 10:19:40ID:???まずはそこをはっきりさせた上で他人に勧めてくれないか。
0274nobodyさん
2009/09/09(水) 16:52:27ID:???print $value;
}
これって駄目なの?
0275nobodyさん
2009/09/09(水) 17:52:15ID:???foreach $value (keys %{$DATA{$unko}}){
print $value;
}
0276nobodyさん
2009/09/09(水) 17:57:47ID:???と2回言ってるようなもの
簡単にいえば無駄な書き方
■ このスレッドは過去ログ倉庫に格納されています