Perlコーディング初心者質問スレ Part 49
■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん
2006/05/31(水) 04:32:28ID:???【投稿する際の注意】
質問するときは内容をよく吟味してから投稿してください。
「コマンドの意味がわかんない」とかはマニュアル見ましょう。
回答者さんは何でも屋じゃありません。
1: 自分はこういう事がしたい。
2: それでこんな風にやってみたが・・・
3: こんなエラーが出て上手く行かなかった。
最低でも1と3が無いと誰も答えられないよ。
ソース貼る時は、全角スペースでインデント忘れずに。
良い回答は良い質問から。一緒に勉強しましょう。
過去ログやお勧めサイトは >>2-10
0035nobodyさん
2006/05/31(水) 21:58:58ID:???おらいりーは有用だけど余計な文が多くてあまり馴染めんかった
0037nobodyさん
2006/05/31(水) 23:33:41ID:???0038nobodyさん
2006/05/31(水) 23:36:50ID:???ラクダ本は、必要な所だけスキャンして処分(ボロボロだったので)。
現在うちにあるPerlの本はAdvanced Perl のみ…。
0039nobodyさん
2006/05/31(水) 23:39:11ID:???0040nobodyさん
2006/06/01(木) 00:00:48ID:???0041nobodyさん
2006/06/01(木) 00:14:11ID:???0043nobodyさん
2006/06/01(木) 12:09:27ID:???>>18を無視するな…>>32はネタだ。
@splited = split /,/, $csv
まあ要するに>>19。split(とeval)を提示された時点で検索していれば、
splitが求めるものだとすぐ分かるはずなのにそれを怠っているとしか思えない。
0045nobodyさん
2006/06/01(木) 18:57:05ID:???>17=42
my @array = split(/,/, $string);
split → 文字列(第2引数)を区切り子(第1引数)で分断し、その配列を返します。
my → 変数の局所化
/,/ → 正規表現でカンマ区切りを指定
$string → ここではカンマで区切られた文字列が入ってると仮定
@array → split関数によって返された配列が入る
以上
スクリプトを組む上で必ず使うような関数は、書式を完全に覚えろとは言いません。
せめてやりたいことから関数名を連想(要は逆引き)できるようにしませう。
0048nobodyさん
NGNGhttp://perl.misty.ne.jp/function02/split.html
0049nobodyさん
2006/06/01(木) 19:41:05ID:???<!--start-->
cgiからの書込み
<!--end-->
って出来るのを最近知ったんですがどういう風に書くんですか?
ネットで探してもこのスクリプトが載ってないのだが・・・。
0050nobodyさん
2006/06/01(木) 19:45:57ID:???0051nobodyさん
2006/06/01(木) 19:48:35ID:???テンプレートとなるHTMLを1行ずつ読み込む
<!--start-->が現れたら処理開始
<!--end-->が現れたら処理終了
そんなことよりも(すごい巨大なデータでなければ)
<!--INSERT-->とかを置換した方がスマートかな
0052nobodyさん
NGNG0053nobodyさん
2006/06/01(木) 19:56:54ID:???0054nobodyさん
2006/06/01(木) 19:57:40ID:???む?
「 .htmlで 」 って拡張子でかいてるから、HTMLファイルにアクセスしてやりたいってことじゃないの?
エスパー失敗?
0055nobodyさん
2006/06/01(木) 20:09:17ID:???を求めてると判断した次第
>54
SSIだったら<!--#exec 〜-->って表記をするはずだし、startとendとペアで記述するもんじゃないから
SSIは違うんじゃね?と思った
よく見たらいきなりスバっと書きすぎてたかな
気分を害してたらゴメ
0057nobodyさん
2006/06/01(木) 20:55:56ID:???0058nobodyさん
2006/06/01(木) 20:57:12ID:???多くの住人もエスパーさんも「そんな感じの」ではわからんのです。
>>55の冒頭が「やりたいこと」だったら、>>51とか。
「だから>>51のやりかたを…」とか言われると果てしなく続くのです。
0060nobodyさん
2006/06/01(木) 21:04:54ID:???>57でもOKだけど
一応考え方の参考って事で・・・(略記だけど)
my %template;
$template{##TITLE##}="あ〜";
$template{##BODY##}="う〜";
open(FH, "テンプレートHTML"); read(FH, $templatehtml, (-s FH)); close(FH);
foreach(keys(%template)){
$templatehtml=~s/$_/$template{$_}/g;
}
print $templatehtml;
HTML には挿入したい場所に##TITLE##とかを書いておけばOKです
0061nobodyさん
NGNG0062nobodyさん
2006/06/01(木) 21:09:47ID:???これ以上書くならテンプレート形式を使ってるスクリプトを眺めろとしか言えないし
0063nobodyさん
2006/06/01(木) 21:10:01ID:???0065nobodyさん
NGNG0066nobodyさん
2006/06/01(木) 21:42:09ID:???0067nobodyさん
2006/06/01(木) 21:50:08ID:???散々単語が出てきてるのに・・・おまえもう来るなカス
0068nobodyさん
2006/06/02(金) 00:14:24ID:???0069nobodyさん
NGNGとか
0071nobodyさん
2006/06/02(金) 00:45:57ID:???0072nobodyさん
2006/06/02(金) 01:30:15ID:???print lc().uc() for (a..z);
0073nobodyさん
2006/06/02(金) 01:31:18ID:???いやいや敢えてこんな感じで。
my $m = 25;
$_ -= $m--, print chr $_ - 32, chr and --$m for reverse 97..122;
0074nobodyさん
2006/06/02(金) 01:43:41ID:???0075nobodyさん
2006/06/02(金) 02:16:24ID:???ありがとうございました
それから、マイドキュメントにあるホームページアップ用のhtmlファイルのjpgを全てpngにしたいんですが
どのようにすればよいですか?
いちおうこんな感じにやってみたんですがウンともスンともいいませんでした
open IN,"./1.html";
while ( $word = <IN> ){ $words .= $word;}
close IN;
open ADD,">./1.html";
$words =~ s/jpg/png/g;
print ADD "$words";
close ADD;
どこがミスってますか?
0076nobodyさん
NGNG0078nobodyさん
2006/06/02(金) 03:12:56ID:???>>77
全部の open と close の後に or die $! って書いてみよう。
open IN, "./1.html" or die $!;
...中略...
close IN or die $!;
というふうにね。
困った時に時々原因を教えてくれるおまじないだよ。
これからは必ず付けるようにしてね♪
0080nobodyさん
2006/06/02(金) 03:49:36ID:???まず、置換・書き込み部分はコメントアウトして、読み込んだ後に
$words を print して正常に読み込めているか確かめる。
正常に読み込めているのを確認したら、置換部分を有効にして、置換した後に
$words を print して本当に置換されているか確かめる。
正常に置換されていたら、書き込み部分を有効にして、書き込みファイル名を変えてみる。
・書き込み先のパスをフルパスで指定してみて、正常に書き込めるか確かめる
・存在しないファイル名を指定して、新規作成してみる
・既存のファイル名を指定して、上書きしてみる
これだけやれば原因がわかるはず。
008179
2006/06/02(金) 04:02:27ID:???とりあえずこんな感じでテストしてみました
デスクトップのaフォルダの中に1.htmlとtest.pl
# test.plの中身
$name = "./1.html";
open OUT,">>$name";
print OUT "test\n";
close OUT;
これでコマンドプロンプトから実行してもだめでした
0082nobodyさん
2006/06/02(金) 04:43:31ID:???でなけりゃ一回ファイル名変えてやってみ。
たまに自分のアホなスクリプト実行したせいでファイルがロックされてる場合がある。
ソース自体は普通みたいだから、絶対なんかヘンなことしてるしw
0083nobodyさん
2006/06/02(金) 04:59:21ID:???open errorだったりして…
0084nobodyさん
2006/06/02(金) 05:32:21ID:???0085nobodyさん
2006/06/02(金) 09:47:40ID:???$a2 ="い";
$a3 ="う";
〜
$a50="ん";
このスカラー変数を、連結して表示したい場合、
print $a1.$a2.$a3.〜$a50;
perlでは、このような表記の仕方しかないでしょうか?
0086nobodyさん
2006/06/02(金) 09:55:34ID:???while(1..50){
$tmpsname = $sname . $_;
$val = \${$tmpsname};
$renketu .= $val;
}
すげぇテキトーw
つかね、配列使ってください
0087nobodyさん
2006/06/02(金) 10:15:26ID:???0088nobodyさん
2006/06/02(金) 10:54:24ID:???あ い う え お
か き く け こ
....
わ を ん
);
local $, = "";
print @hiragana;
qwはタブも改行もスペース扱いしてくれるぞ
0089nobodyさん
2006/06/02(金) 10:55:50ID:???print @Hiragana;
ちなみに$a50="ん";にはならんぞ。50音て50個じゃないから
0090nobodyさん
2006/06/02(金) 10:59:55ID:???リファレンスを連結している
my $sname='a';
print join '', map { ${"$sname.$_"} } (1..50);
動かしてないがこれでよくね?
0091nobodyさん
2006/06/02(金) 11:22:34ID:???とりあえずグローバル変数やたら定義すると面倒で適わんね。
0092nobodyさん
2006/06/02(金) 11:25:06ID:???… 実は map の使い方というか使う意義がわかんねw
あとでリファレンス立ち読みしてみるかにゃ
0093nobodyさん
2006/06/02(金) 11:35:03ID:???0094nobodyさん
2006/06/02(金) 13:54:21ID:???0095nobodyさん
2006/06/02(金) 14:26:56ID:???さ し す せ そ た ち つ て と な に ぬ ね の
は ひ ふ へ ほ ま み む め も や ゆ よ
ら り る れ ろ わ を ん);
print map{${$_->[0]} = $_->[1]}map{['a'.$_ ,$hiragana[$_-1]]}(1..46);
なんか質問の主旨とは違うよーな気もするが
0096nobodyさん
2006/06/02(金) 15:05:28ID:???0097nobodyさん
2006/06/02(金) 15:25:35ID:???ん〜、エラーっすねぇ
Can't use string ("a.1") as a SCALAR ref while "strict refs" in use at /test.cgi line 16.
${"a$_"} にしたら
Can't use string ("a1") as a SCALAR〜
で同じエラー
俺にゃ難しい宿題だw
0098nobodyさん
2006/06/02(金) 16:09:13ID:lBhNFSRP${"@{[substr($s,0,1]}$_"}=substr($s,$_*2-1,2)for(1..length($s)/2); #ここまでセットアップ
print join '', map ${"a$_"}, (1..10); # 好きな数だけloopすれば?
0100nobodyさん
NGNG0102nobodyさん
2006/06/02(金) 17:22:15ID:???no strict 'refs';
my $sname='a';
print join '', map { ${"$sname$_"} } (1..50);
0103nobodyさん
2006/06/02(金) 18:06:46ID:???文句多いな。
local $r = sub{((@_[0] > 1) ? $r->(@_[0]-1) : ''). eval('$a'.@_[0])};
print $r->(50);
0104nobodyさん
2006/06/02(金) 20:13:53ID:???sub p { my $n = shift; my $p; ($p = sub { print chr($n += shift); $p })->() }
p(0x48)->(0x1D)->(0x07)->(0x00)->(0x03)->(-0x43)->(-0x0C)->
(0x57)->(-0x08)->(0x03)->(-0x06)->(-0x08)->(-0x43)->(-0x17);
0105nobodyさん
2006/06/02(金) 20:16:51ID:???print $test; # ここで実体化(ハード)
代入する段階でハードリファレンスってどうやるの?
0106nobodyさん
2006/06/02(金) 20:22:18ID:???0107nobodyさん
2006/06/02(金) 20:22:33ID:???0108nobodyさん
2006/06/02(金) 20:23:28ID:???0109nobodyさん
2006/06/02(金) 20:24:21ID:???0110nobodyさん
2006/06/02(金) 20:25:29ID:???0111nobodyさん
2006/06/02(金) 20:35:06ID:???use Tie::Man::And::Man;
my $happy = tie $res106, Tie::Man::And::Man, $res107;
0112nobodyさん
2006/06/02(金) 20:37:13ID:???$happy->insert(); # ここで実体化(ハード)
挿入する段階でハードリファレンスってどうやるの?
0113nobodyさん
2006/06/02(金) 20:43:35ID:???$test = \1; # リテラルスカラー値に対するハードリファレンス
print $$test; # デリファレンス
多分シンボリック=リテラルだと思ってるのかな と想像。
シンボリック=実体はただの文字列。文字列をデリファレンスするとシンボルテーブルから
その名前を持つモノをひっぱってきてくれる。
0114nobodyさん
NGNG0115nobodyさん
2006/06/02(金) 21:01:00ID:???0116nobodyさん
2006/06/02(金) 21:46:32ID:???0117nobodyさん
2006/06/02(金) 22:15:15ID:???俺もよくわかんなくて、ガンガッってググったよ。
ここ↓とかどう? perl-解説ってとこ。
山口家の逆襲
http://kabocha.org/jelfe/
0118nobodyさん
2006/06/02(金) 22:23:29ID:???0119nobodyさん
2006/06/02(金) 22:38:40ID:???0120nobodyさん
2006/06/02(金) 22:45:09ID:???●リテラル
コードに直接埋め込まれている値
・123 3.14 のような数値
・"abc" 'hoge' のような文字列
・(1, 2, 3) (hoge=>123, huge=>456) のようなリスト など
●ハードリファレンス(ただ単にリファレンスと言った場合はこれ)
値に対する参照。これ自体もスカラー値。C言語やってた人はポインタと考えれば良い。
ハードリファレンスを生成するには、以下の方法がある。
・値や変数の前に「\」を付ける → その値に対してのリファレンス
・[1, 2, 3] → 無名の配列が自動的に作られて、その無名配列に対するリファレンス
・{hoge=>123, huge=>456} → 無名のハッシュに対するリファレンス
・sub { CODE } → 無名の関数に対するリファレンス(クロージャ)
●シンボリックリファレンス
ただの文字列。文字列をデリファレンスすると、パッケージが持つシンボルテーブル
(パッケージ変数の名前と実体を結び付ける表)を通じて、その文字列の名前を持つ
実体を得る事ができる。誤爆しやすいので use strict; すると使えない。
0121nobodyさん
2006/06/03(土) 00:18:22ID:???0122nobodyさん
2006/06/03(土) 02:04:02ID:???0124nobodyさん
2006/06/03(土) 18:24:46ID:???$" = '/';
@list = (10, 20, 30, 40, 50);
$scalar = "@list";
これで
$scalar = join( "/" , @list);
と同じ結果になるようだけど、「$" = '/';」を使った場合には、
特殊変数$"のデフォルトの値を変えてしまうから
その後もずっとjoinせずとも/で区切られた値になるという感じなのかな。
他にはサブルーチンの@_とかは元の値が変わっちゃうみたいだけど、
特殊変数の扱いはブロックの中だけ?それともブロックの中とか関係なし?
どちらの場合もある?
その辺は一時的なものなのか、恒久的(ちょっと変な表現だけどw)なのか教えて下され。
0125nobodyさん
2006/06/03(土) 18:54:27ID:???ただし、mod_perl とか $" とかだとうまくできない場合があるね。
「特殊変数」 が 「$"」 とかを指すなら、
それの有効範囲はグローバル変数と一緒。
local $" とかもできるよ。
0126nobodyさん
2006/06/03(土) 18:56:58ID:???perl -e '@a=qw/a b c/; {$"=q!/!; print "@a\n";} print "@a\n";'
0127nobodyさん
2006/06/03(土) 20:34:18ID:???0128nobodyさん
NGNG0129124
2006/06/03(土) 22:08:37ID:???なんとなくイメージがつかめたよ。
0130nobodyさん
2006/06/03(土) 23:16:29ID:???my にはグローバル変数およびパッケージ変数を宣言する能力がないので
ここにlocalとmyの大きな差がある。
呼び出し先のサブルーチンでの参照可能性でlocalとmyの差を説明するやつはウンコ
0131nobodyさん
2006/06/04(日) 00:07:15ID:???our→パッケージ変数の宣言
local→パッケージ変数のダイナミックスコープ化
という理解でおk?
0132nobodyさん
2006/06/04(日) 00:46:14ID:???■ このスレッドは過去ログ倉庫に格納されています