【Perl】初心者コーナーPart10
■ このスレッドは過去ログ倉庫に格納されています
0001名無しさん@お腹いっぱい。
02/02/24 22:18ID:zOj6Yq/31:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。
1と3が無いと誰も答えられないよ、良い回答は良い質問から。
一緒に勉強しましょう。
参考書籍はこちら【【Perl,CGI】参考書籍 第2版 】
http://pc.2ch.net/test/read.cgi/php/988809842/
CGIの質問はこちら【CGIだけど、なんか質問ある?part5】
http://pc.2ch.net/test/read.cgi/php/1009331505/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般】
http://pc.2ch.net/test/read.cgi/php/991313362/
過去ログ、その他の役立ち情報は>>2-10を見よう。
0137nobodyさん
02/03/02 22:18ID:???適当なところに以下の文を追加
print scalar localtime;
これで分からなきゃCGI改造スレ行け。
その際はそのアップローダのソースをどこかに上げろよ。
0138137
02/03/02 22:19ID:???残り時間はサーバー側じゃ無理だわな。
0139nobodyさん
02/03/02 22:30ID:???から無理じゃないっしょ?
0141nobodyさん
02/03/02 23:03ID:???表示できるじょ。
0142nobodyさん
02/03/02 23:07ID:???が効いて送り終わって無くても応答取ってるかも。
実験してみよう。
0143nobodyさん
02/03/03 04:22ID:???表示させたいという場合はどのように記述すればいいのか教えてください。
例
a1,a2,a3,a4,a5,a6,a7,a8,a9,
b1,b2,b3,b4,b5,b6,b7,b8,b9,
とデータがある時に左から5列目、つまりa5とb5を取り出す。
よろしくお願いします。
0145129
02/03/03 05:00ID:IQ08Jes1URLでパラメータで渡したいから、URLで使える文字だけにしたいんよね、
エスケープシーケンスだと長くなっちまうから、ちょっとねぇ〜
0146nobodyさん
02/03/03 05:20ID:vLChsjTspush @array , (split /,/)[4] ;
}
print @array ;
こんな感じかな?
0147nobodyさん
02/03/03 06:25ID:???0148nobodyさん
02/03/03 07:54ID:qCUfXnEh指定した長さのランダムな文字列って事?
使用する文字列の範囲を教えて。
0149nobodyさん
02/03/03 08:09ID:+mcyIDOm$str =~ s/$str1/$str2/;
なのですが $str1,$str2 にも "/" "." などが入っているのが問題なのだと思うのですが
うまくいきません(というか無限にループしているみたいになっています)
$str =~ s/\Q$str1/\Q$str2/;
というのを見つけたのですが、$strが"\"マークだらけになってしまいます
どうしたらうまく置換できるのでしょうか?
0152nobodyさん
02/03/03 14:11ID:IQ08Jes1perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
LANGUAGE = "ja_JP.ujis",
LC_ALL = "ja_JP.ujis",
LC_MESSAGES = "ja_JP.ujis",
LC_CTYPE = "ja_JP.ujis",
LANG = "ja_JP.ujis"
are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
This is perl, v5.6.1 built for i586-linux
Copyright 1987-2001, Larry Wall
Perl may be copied only under the terms of either the Artistic License or the
GNU General Public License, which may be found in the Perl 5 source kit.
Complete documentation for Perl, including FAQ lists, should be found on
this system using `man perl' or `perldoc perl'. If you have access to the
Internet, point your browser at http://www.perl.com/, the Perl Home Page.
って感じで、localeでしかられちゃうんだけど、どしたらええのかね、
ちなみに、環境変数は
export LANGUAGE=ja_JP.ujis
export LANG=ja_JP.ujis
export LC_CTYPE=ja_JP.ujis
export LC_ALL=ja_JP.ujis
export LC_MESSAGES=ja_JP.ujis
こんな感じにしてます
0155152
02/03/03 14:21ID:IQ08Jes1Linux(slackware)
0156暗号化だが
02/03/03 14:29ID:IQ08Jes1漏れは、URLで使える文字に変えるってのが知りたい
極力、1バイト、一文字に抑えて、足りない分は、
!Aとかで、2文字にしていく、ハフマンのエンコード部なんか
参考になりそうだなぁ〜とか、思ったりしてた。
暗号化ってより、圧縮、変換の話か・・・
0157IQ=8 だって --->
02/03/03 14:30ID:???0159nobodyさん
02/03/03 15:30ID:???長さが長くなるのくらいあきらめろ、って気がしてきた。
URLに使われる文字がABCDEFGHだけだとして、
tr/ABCDEFGH/DGFHCEAB/;
ってのはどうだ?
0161156
02/03/03 15:59ID:IQ08Jes1必要に感じた事無い?
0163143=151
02/03/03 16:42ID:K6uur/rZcsvから情報を選び出すことは出来たのですが、
次はそのデータを比較して、条件に合ったときだけ取り込みたくて
以下のようにしたのですがうまくいきません。
アドバイスお願いします。
open(DATAFILE,"data.csv");
while (<DATAFILE>) {
push @TMPDATA ,(split /,/)[0,5] ;
if (@TMPDATA[0] < @TMPDATA[1])
{
push @TIME ,(split /,/)[1];
}
}
それとスペースも入ってない空欄
1,2,,4,←こんな状態
の部分はどのように判別すればいいのですか?
よろしくお願いします。
0165163
02/03/03 17:27ID:K6uur/rZ参考にして
push my @TMPDATA ,(split /,/)[0,5] ;
としてみると、思い通りに動きました。
空欄の処理の仕方も何方かアドバイスお願いします。
0166nobodyさん
02/03/03 19:22ID:zlwT/08tCGIを動かそうとしたらエラーになってしまいます。
原因は何が考えられますか?
Win2K(SP2)+Apache1.3.24+Perl5.6.620です。
0172nobodyさん
02/03/03 21:08ID:???例えば、以下のコードはSynax OKだが実行した瞬間死ぬ。
#!/usr/bin/perl
foo()
__END__
0173nobodyさん
02/03/03 21:14ID:/fm96Lfbのplファイルが黄色いボールのアイコンになってしまいました。
この関連付けを解除する方法は無いですか?このままでも問題無し?
あと、いずれはCGIスクリプト書けるようになりたいですが、まず最初の
段階ではActivePerlをインスコして参考書読みながらコマンド打っていくの
がいいんでしょうか?サーバソフトとかまだ入れてないんですが・・
0175166
02/03/03 21:16ID:zlwT/08tApacheのログを見たら分かりました。
print "Content-type: text/html\n\n"を忘れてBad headerでした。
超初心者的ミス、鬱だ。
0176173
02/03/03 21:24ID:/fm96Lfbそんな事言わずにお願いします。
>インストールして
訂正します。すみませんでした。
ちなみに参考書は「すぐわかるPerl 深沢千尋/著」を買ってきました。
0177nobodyさん
02/03/03 21:26ID:???その本は素晴らしいよ。
基本的にはコマンドプロンプトでPerl a.cgiとするのが王道。
俺は秀丸マクロで開発環境作ったけど。
0179163
02/03/03 23:17ID:K6uur/rZCSVデータの中に空欄があったら処理を実行せずにデータがあればそれから処理を実行したいんです。
0180163=179
02/03/03 23:22ID:K6uur/rZopen(DATAFILE,"data.csv");
while (<DATAFILE>) {
push my @TMPDATA ,(split /,/)[0,5] ;
if (@TMPDATA[0] < @TMPDATA[1])
{
push @TIME ,(split /,/)[1];
}
}
のifのところで@TMPDATA[0] 、@TMPDATA[1]のどちらかが空欄なら以下の処理をせずに終わりたいんです。
0182nobodyさん
02/03/03 23:42ID:???0183nobodyさん
02/03/04 00:10ID:???strict下ならvarsモジュールを使えばいいのに。
localとは違うからいいの?
018495
02/03/04 00:12ID:KNDHr4Nosub sub_routin {
my (%data) = @_;
use strict;
use Fcntl;
use SDBM_File;
my %hash = ();
my $data_base = 'data_base';
tie (%hash, 'SDBM_File', $data_base, O_CREAT|O_RDWR, 0666);
#この命令自体はあまり意味は無いが、要はハッシュのハッシュを使いたい
foreach my $number (1..100) {
while ( my ($key, $value) = each (%data) ) {
$hash{$number}->{$key} = $value;
}
}
untie (%hash);
}
上のように、tieからuntieの中でハッシュのハッシュを使おうとすると
Can't use string ("HASH(0x1c37ddc)") as a HASH ref while "strict refs"(以下略)
などと怒られてしまい、使えません。多次元構造のデータの外部化って無理なんですか?
0185183
02/03/04 00:12ID:???http://www.midnightroam.org/source/minibbs2_77.txt
0186nobodyさん
02/03/04 00:16ID:???$hash{$number, $key} = $value にすれば?
0187nobodyさん
02/03/04 00:17ID:???漏れの場合はvarsを知らなかったので、myを
使ってる。「strict使ったら怒られたから、
myを付けたらOKだった」という感じだった。
varsを使った方がいいのかな。
0189149
02/03/04 02:25ID:zvOvcxtF自分なりにいろいろやってみたのですが、全く別の問題だと分かりました
$string = 'Watashi ga Kaita. Watashi ga Keshita';
while ($string =~ /Watashi/igo) {
$value = 'Watashi(=Yamada)';
$string =~ s/Watashi/$value/i;
}
print "$string";
なのですが、無限にループ(?)しているような状態になります
表示したい文字列は
Watash(=Yamada)i ga Kaita. Watashi(=Yamada) ga Keshita
にしたいのです
この例の場合には置換で1行で出来るのですが、whileループの中で
いろいろと処理をさせたいのでこの様にしています
$value = 'Ore(=Yamada)';
$value = 'Yamada';
のようにすると無限ループのような状態にならずに
Ore(=Yamada) ga Kaita. Ore(=Yamada) ga Keshita
Yamada ga Kaita. Yamada ga Keshita
と変換されて表示されるのでパターンマッチに使った文字列から
始めない場合はうまくいくようなのですがその理由も良くわかりません
なんかそもそもアプローチ自体がおかしいような気がしてきてはいるのですが
ご教授いただけるとうれしいです
0190nobodyさん
02/03/04 02:27ID:???>表示したい文字列は
>Watash(=Yamada)i ga Kaita. Watashi(=Yamada) ga Keshita
Watashi(=Yamada) ga Kaita. Watashi(=Yamada) ga Keshita
です 申し訳ありません
0191nobodyさん
02/03/04 03:03ID:???鯖に存在するファイルの読み書きは知ってるんですが
ファイル自体を出力する処理方法ってありますか?
(更新ごとに新しいファイルを出力するみたいな)
よろしくお願いします。
0196nobodyさん
02/03/04 10:14ID:???Watashi ga Kita Watashi ga Kita
↓
Watashi(=Yamada) ga Kita Watashi(=Yamada) ga Kita
↓
Watashi(=Yamada)(=Yamada) ga Kita Watashi(=Yamada)(=Yamada) ga Kita
↓
Watashi(=Yamada)(=Yamada)(=Yamada) ga Kita Watashi(=Yamada)(=Yamada)(=Yamada) ga Kita
$string =~ /Watashi$s/igo
0199nobodyさん
02/03/04 13:40ID:???0200nobodyさん
02/03/04 13:43ID:???-P causes your script to be run through the C
preprocessor before compilation by Perl. (Because
both comments and cpp directives begin with the #
character, you should avoid starting comments with
any words recognized by the C preprocessor such as
"if", "else", or "define".)
0202nobodyさん
02/03/04 13:52ID:???0203nobodyさん
02/03/04 13:56ID:???use constant NDEBUG => 1;
use constant STRING => "hello, world!\n";
if(defined &NDEBUG){
print STRING;
else{
# ..
}
それはそうと>>201は何故こんなに偉そうなんだ?
0205nobodyさん
02/03/05 06:00ID:???whileループの突入条件とそのループ内で同じ文字列のマッチングを行っているのが原因。
これでは文字列のどこまでマッチ作業を試行したのかわからなくなってしまうよ。
具体的にはwhileループ内のマッチ作業によってpos($string)がundefで上書きされてしまう。
$string = 'Watashi ga Kaita. Watashi ga Keshita';
while ($string =~ /Watashi/ig) { # ←◆g修飾詞によってpos($string)が設定される。
$value = 'Watashi(=Yamada)';
$string =~ s/Watashi/$value/io; # ←◆pos($string)がundefで上書きされる。(゚д゚)マズー
}
print "$string";
要するに$stringのマッチ開始位置が巻き戻ってしまう。
このため突入条件のマッチングはg修飾詞があっても常に$stringの先頭から行われてしまい、
$string内にWatashiという文字列がある限りwhileがループを続けてしまう。
>189がやりたい(であろうと漏れが考えた)事をむりやり書き下してみると、
# pos再設定とマッチ以後の文字列置換でむりやり解決
$string = 'Watashi ga Kaita. Watashi ga Keshita';
while ($string =~ /Watashi/ig) {
$value = 'Watashi(=Yamada)';
my $position = pos $string;
if (substr($string, $-[0]) =~ s/Watashi/$value/io) {
$position += length $value;
}
pos $string = $position;
}
print "$string\n";
こんな感じになるんだろうか。でもこんなスクリプトは見た事が無い。
アプローチというか何というか、たぶん他にもっと良い書き方があるのだと思う。
単純に解決したいならループ内で $string =~ s/Watashi(?!\(=Yamada\))/$value/io とか、
処理を挟むなら $string =~ s/Watashi/&process(...)/eg とか。
取り敢えず、普通whileの突入条件とそのループ内で同じ文字列のマッチングは行わない。
perlretutやperlop,perlfaq6などを読むと良いかもね。
つうか正直何をやりたいのか良くわからないから的外れかもしれない。そんときゃスマソ。
0206nobodyさん
02/03/05 06:12ID:???$position += length($value) - length('Watashi');
だね。どーでもいいか。
0207nobodyさん
02/03/05 13:00ID:???&subname; で飛ばす場合は、どちらの方がメモリ消費が少ないのでしょうか?
自分は()を付けると、サブルーチン先の@_と、呼び出しもとの@_は別物と認識するので、
@_に代入するとその分メモリを消費するが、何も代入しない場合はどっちでも変わらないのでは?
と考えるのですが
0208208
02/03/05 22:03ID:OFFg29v+いつも「エラー2」が出てしまいます。何でうまくいかないのかさっぱり分かりません。
どなたかお知恵を貸してください。
acountlist.dat はこんな感じになってます。
id01:pwd01:point01
id02:pwd02:point02
...
------------------------------------------------------------
print "IDを入力してください\n";
$id = <STDIN>;
chop($id);
print "パスワードを入力してください\n";
$pwd = <STDIN>;
chop($pwd);
open(DATA,"<../xxxxxxx/acountlist.dat") or die;
while($line = <DATA>){
chop($line);
@acount = split(/:/,$line);
if($id eq $acount[0]){
if ($pwd eq $acount[1]){
print "いらっしゃいませ $acount[0] さん\n";
print "現在あなたは $acount[2] ポイントお持ちです\n";
exit;
}else{
print "エラー1";
exit;
}
}else{
print "エラー2\n";
exit;
}
}
close(DATA);
------------------------------------------------------------
0209nobodyさん
02/03/05 22:23ID:???acountlist.dat (accountlist.datのスペルミスだとは思うけど)
の最初の行に書いてある人はOKだね。
0210nobodyさん
02/03/05 22:24ID:???それじゃid01の人しか受け付けないよ.
0211208
02/03/05 23:22ID:???おかげさまでうまくいきました。
0212nobodyさん
02/03/05 23:55ID:???どうせましょう
0213nobodyさん
02/03/06 10:16ID:???データベースから引っ張ってきた件数をGoogleみたいに
1 2 3 4 5 ・・ と自動的にリンクを貼りたいんですが。
0214nobodyさん
02/03/06 10:23ID:???10〜100までの10の倍数の乱数を出したい場合。
1〜10の乱数を出して10倍する。
0215nobodyさん
02/03/06 10:25ID:???ひょっとして、乱数は関係ない?
foreach(1 .. 100){
if($_%10==0){print qq(10の倍数);}
}
って事?
0217nobodyさん
02/03/06 14:04ID:???10の倍数とか関係なかった(ごめん)
どうやったらデータベースから引っ張ってきたデータ件数を
Googleみたいに 1 2 3 4 5 ・・ ってリンクできるんだろ
perlじゃないのかな・・・
0218nobodyさん
02/03/06 14:13ID:???$i=0;
foreach(1 .. $n){
if($_%100==0){print qq(<a href=./hoge.cgi?start=$_>) . ++$i . qq(</a>);}
}
googleはこんな感じだろ。
0219nobodyさん
02/03/06 14:16ID:???$j = HIT数;
for($j=0;$j<=$n/100;$j++){
print qq(<a href=./hoge.cgi?start=) . ($j*100) . qq(>$j</a>);
}
ちなみに>218でもこの方法でも0 1 2 3 となるから、実際には1を足すように。
0220nobodyさん
02/03/06 14:17ID:???>219の最後の一行は忘れて。
頭寝てるかもしれないからもう沈むわ。
混乱させてスマン。
0225nobodyさん
02/03/06 16:04ID:???の略ですm(_ _)m
0226nobodyさん
02/03/06 21:21ID:qVNAtP8C教えて下さい。
0227nobodyさん
02/03/06 21:29ID:???正規表現に通したりすると落ちたりするんですか?
あと2バイト文字でファイル名を作らせるのはまずいですか?
URIエスケープすればどうだろう?
0228nobodyさん
02/03/06 21:33ID:???この辺を参考に。
0230nobodyさん
02/03/06 22:04ID:???ありがとう。
メールやネットニュースが対応してないので使わないクセを付けようということなのかな。
そういや,おれの通ってる大学のイタイ教師がメールのフッタに
「半角カナが世にはびころうとする風潮に断固反対する会 会員No.xx」とか書いてたのを思い出した。
どーでもイイが・・・
0231かなり初心者
02/03/06 22:08ID:+Uo+pWisそれを<a href="3"> >>3 </a>のように置換するやり方ってどうやるので、
しょうか?(ちなみに、数字は可変します。)
お願いします。(コードでご説明下さい。)
0232nobodyさん
02/03/06 22:11ID:???$message =~ s/>>([0-9]*)/<A HREF="$1">$1</A>/g;
0233nobodyさん
02/03/06 22:12ID:???$message =~ s/>>([0-9]*)/<A HREF="http://xxxx.xx.com/xxx.cgi?Res=$1">$1</A>/g;
などにすると良い。
0234nobodyさん
02/03/06 22:14ID:???だった。
■ このスレッドは過去ログ倉庫に格納されています