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

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

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

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

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

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

過去ログやお勧めサイトは >>2-10
0251nobodyさん2005/10/26(水) 15:03:54ID:???
改行コード間違えてんじゃね?
走らせるって@test_newをprintするとってことか?

そもそも

push(@test_new,"$aaa,$bbb_new");



push(@test_new,"$aaa<>$bbb_new");

にしたいんじゃないかと
02522492005/10/26(水) 15:11:27ID:???
>>250
>>251
すいません。カキコ時ミスでした。
そうです。
push(@test_new,"$aaa<>$bbb_new<>\n");
です。

保存時は
&Memory2($dataname,"@test_new");

…とし、保存時流用のため、サブに飛ばしています。
そのサブは以下のようにしています。

sub Memory2 {
    local ($param) = @_[0];
    local (@param2) = @_[1];

    open(OUT, "> $param");
    print(OUT @param2);
    close(OUT);
    chmod(0666,$param);
}
0253nobodyさん2005/10/26(水) 15:13:11ID:???
…お前何の本見ながら勉強してんの?
0254nobodyさん2005/10/26(水) 15:28:49ID:???
>>252
> &Memory2($dataname,"@test_new");
                ~~~~~~~~~~~~~
しっかり括ってるじゃないか・・・原因はこれ
ダブルクォーテーションで括った場合の配列変数の展開は以下と同等
join(@array, $")
$"のデフォルト値は半角スペースだからこういうことになる。

&Memory2($dataname,@test_new);
とすればよい
02552542005/10/26(水) 15:30:08ID:???
うへ、joinの引数順間違えた
join($", @array)
が正解
02562492005/10/26(水) 16:01:49ID:???
>>254
&Memory2($dataname,@test_new);
…とすると1行目の変数しか書き込まなかったので、ダブルクォーテーションを付けていました。

サブに飛ばさず、
open(OUT, "> $dataname");
print(OUT @test_new);
close(OUT);
…とすれば、半角スペース問題が解決しました。

本当にありがとうございました!!
0257nobodyさん2005/10/26(水) 16:12:14ID:???
>>256
ああ、スマソサブルーチンのほうをよく読んでなかった。こっちも間違ってるな
local ($param) = shift @_;
local (@param2) = @_;
とか
local ($param) = @_[0];
local (@param2) = @_[1..$#_];
とかにしないと。
でも、いまさらlocalは古いと思うが・・・
Perl4にも対応しなくてはならないということでなければmyを使うのがお勧め
my $param = shift;
my @param2 = @_;
02582492005/10/26(水) 16:22:44ID:???
>>257
ほんと、重ね重ねありがとうございます。
無事、サブルーチンに渡してもうまくいくようになりました!!
0259nobodyさん2005/10/26(水) 18:29:58ID:???
ファイルから探さずに、ディレクトリ読めばいいだけじゃないの?
0260nobodyさん2005/10/27(木) 18:26:04ID:MmBYG7yb
すいません。
@flagの中に一つでも1があったら
1を返したいのですがよい方法があったら教えていただけないでしょうか?
今の所
if(@flag == 1 && $flag[0] == 1){
return 1;
}elsif(@flag == 2 && $flag[0] == 1&& $flag[1] == 1){
return 1;
}elsif(@flag == 3 && $flag[0] == 1&& $flag[1] == 1&& $flag[2] == 1){
return 1;
}elsif(@flag == 4 && $flag[0] == 1&& $flag[1] == 1&& $flag[2] == 1&& $flag[3] == 1){
return 1;
}elsif(@flag == 5 && $flag[0] == 1&& $flag[1] == 1&& $flag[2] == 1&& $flag[3] == 1&& $flag[4] == 1){
return 1;
}else{
return 0;
}
とやっているのですが不恰好なので。
0261260 2005/10/27(木) 18:29:10ID:MmBYG7yb
あ、、、すいません。
>@flagの中に一つでも1があったら
じゃなくて@flagの中全部1だったらです。
0262nobodyさん2005/10/27(木) 18:44:52ID:???
>>260-261
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq4.html#How_can_I_tell_whether_an_list_o

sub check {
  $_ == 1 || return 0 for @_;
  1;
}

print check(@flag) ? 'OK' : 'NG';
0263nobodyさん2005/10/27(木) 19:43:10ID:???
return @flag == grep($_ == 1, @flag) ? 1 : 0;
0264nobodyさん2005/10/27(木) 19:50:18ID:???
>>263
それも思い付いたけど、@flag が (1, 1, 1, ..., 1) とかだと遅い。
0265nobodyさん2005/10/28(金) 01:41:57ID:bf2gwUIh
foreach (@flag) {
 /(^0^)/;
 /(f^_^)/;
}
0266nobodyさん2005/10/28(金) 01:54:14ID:???
orz=3;
0267nobodyさん2005/10/28(金) 06:37:45ID:OMxdiAJ2
>>260
foreach (@flag){
 if($_ == 1){ return 1; }
}
じゃ駄目?

>>257
my($param, @param2) = @_;
ってやっちゃ駄目ですか?
自分のスクリプトではこうやって渡しちゃってるんですが・・・
0268nobodyさん2005/10/28(金) 06:48:30ID:zLDMG+JK
>261
sub flagcheck{
  my(@flag) = @_;
  foreach (@flag){ if(!$_){ return 0; }}
  return 1;
}
0269nobodyさん2005/10/28(金) 06:49:19ID:zLDMG+JK
sub flagcheck{
  foreach (@_){ if(!$_){ return 0; }}
  return 1;
}
これでよかったか
0270nobodyさん2005/10/28(金) 07:01:39ID:???
超好みの問題だけども
if(!$_){ return 0;
より
return 0 unless $_;
の方が……どうでもいいか。
それより、0と1しか入っていないことは保障されてる?
0271nobodyさん2005/10/28(金) 07:11:26ID:zLDMG+JK
>>270
書きながらそれは思ったけど、質問の段階で 0 と 1 しか出てこなかったので ^^;
1 以外が入ってれば … も考えるなら
if($_ != 1){ return $_; }
かな?
0272nobodyさん2005/10/28(金) 07:20:20ID:???
unless ($_) { return 0; } または return 0 unless $_;
次の行に return $_;
個人的にだけど、否定だけで分岐する場合にはunlessが見やすいと思う。
0273nobodyさん2005/10/28(金) 07:33:02ID:FKANG7gP
use strictを使うように心がけようと思い、ここ最近ののソースには書いているのですが、
requireしたファイルの中でグローバルを宣言するにはどうしたらいいのでしょうか?
requireしたソース中でmy宣言したらその中でしか見えず、エラーが出てしまいました
0274nobodyさん2005/10/28(金) 07:52:12ID:???
>requireしたファイルの中でグローバルを宣言するにはどうしたらいいのでしょうか?
kentのように、1つの変数をずっと使うような設計は止めたほうがいい。

>requireしたソース中でmy宣言したらその中でしか見えず、エラーが出てしまいました
ソースのmyというか、スコープをもう一度勉強して。

むりやりstrictでエラーを出させないようにするなら、qw($hoge);
0275nobodyさん2005/10/28(金) 09:05:27ID:???
>>273
274の言うように可能なら変数を見せなくてすむように設計を見直した方が
いい場合が多いが、どうしてもやりたいのならモジュールにしてimport/export
するのがいいんじゃないかね。
0276nobodyさん2005/10/28(金) 09:15:21ID:FKANG7gP
レスありがとです。
requireした先でのグローバル確保したいってのは止めた方がいいというのは分かってはいるのですが・・・

やっぱ面倒くさがりはじめるとエラーが多くなるんでしょうかね。
出来る限り引数、戻り値を設定して呼ぶようソース見直します。

ありがとうございました。
0277nobodyさん2005/10/28(金) 09:23:34ID:???
悪い癖を覚えないうちにアドバイス。
コーディングはファイルサイズ増えても、半角スペースとタブをうまく使うようにするといいよ。
あと、コメントも適度にあるといいね。
0278nobodyさん2005/10/28(金) 10:43:47ID:???
>>273
参照/設定専用のサブルーチンを作ってそれでアクセスするようにすればいい。
オブジェクト指向で言うところのアクセサってやつ。
0279nobodyさん2005/10/28(金) 10:59:28ID:???
my(@flag) = @_;
といったカッコをつけたコードはどういう意味があるのでしょうか?
0280nobodyさん2005/10/28(金) 11:10:09ID:???
>>279
リスト。

http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perldata.html#List_value_constructors
0281nobodyさん2005/10/28(金) 11:14:37ID:???
多分こういうことを聞きたかったのかとエスパーしてみた。

myをまとめて指定する場合()でくくる必要がある。
別にmy @flag = @_;でも可
my ($hoge,@flag) = @_; としていて、$hogeを消した名残かもしれない。

my (@flag) = @_;
my ($foo, $bar);
my (@age, @sage); と連続して書く場合、見た目の為?に括弧くくりしてあるのも見かける。
0282nobodyさん2005/10/28(金) 11:26:27ID:3fcMXuGT
my($a, $b);
ってする時に括弧をつけるので、見た目統一のために1つのみの宣言でも括弧を付けてます。
02832792005/10/28(金) 12:31:13ID:???
すみません281さんの通りです。
右辺のコンテキストを変えた、もしくはmyの適用範囲を指定したコーディングでもないのに
カッコを付けるのが紛らわしく感じたのです。
0284nobodyさん2005/10/28(金) 13:18:53ID:???
>>267
> my($param, @param2) = @_;
> ってやっちゃ駄目ですか?
もちろん構わない
shiftを使って引数を取り出すかリストコンテキストで一気に代入するかは好みが現れる所だろうな

しかし、自分でも書いた後、説明とはいえ
> local ($param) = @_[0];
> local (@param2) = @_[1..$#_];
こんな回りくどいやり方は無いなと思った…しかも上間違えてるし$_[0]
0285nobodyさん2005/10/28(金) 13:36:59ID:???
>>277
それ激しく同感。上手くタブとスペースを使い分けて書かれてるソースってめったに見られないよな

よくあるのがこういうインデントだけど、タブ幅が変わると悲惨なことになる
if (expression) {
____for (range) {
[_TAB__]{ #Some blocks
[_TAB__]____function(multiline,
[_TAB__][_TAB__]_____arguments)
[_TAB__]}
____}
}

漏れの思う理想形はこんな感じ。これならタブ幅がいくら変わっても適切なインデントで見られる
if (expression) {
[TAB]for (range) {
[TAB][TAB]{ #Some blocks
[TAB][TAB][TAB]function(multiline,
[TAB][TAB][TAB]_________arguments)
[TAB][TAB]}
[TAB]}
}
0286nobodyさん2005/10/28(金) 15:23:43ID:???
>>285
上の例、ひどすぎないか?
tab size を 8 にして、indent size を 4 にしているということ?

> よくあるのがこういうインデントだけど、

よくあるのか・・・?
0287nobodyさん2005/10/28(金) 15:30:15ID:???
>>286
そういうこと
Perlの標準モジュールとか見てみれ 大半がこんなだよつд`)
CGI.pmとかMemoize.pmとか
0288nobodyさん2005/10/28(金) 15:36:36ID:???
>>286
同じソースを複数人で弄っていて、コーディング規約も何もない場合
tab と space が混在してもっとひどいことに・・・。
0289nobodyさん2005/10/28(金) 15:58:45ID:???
>>286
Emacs のデフォルトがそんなんだったような。
漏れの思う理想形は、タブは一切使わず SPACE のみでインデント。
Emacs なら (setq-default indent-tabs-mode nil) しると。
0290nobodyさん2005/10/28(金) 16:52:13ID:???
>>289
スペースのみか、それも良いな
でも、漏れが読むときは全部タブに置換することが度々
スペースで固定しちゃうと、その人の好みのインデント幅に合わせて
読めないというのがあるんだよなぁ…
# 個人的に、使い慣れてるエディタ上でのタブを表す→を、
# インデントとしてみるように目が慣れちゃってるのもあるのかも

まあ好みは人それぞれ分かれるから、他人のソースを読むときは
PerlTidyを通すのを習慣付けろってことか、これは
0291nobodyさん2005/10/28(金) 17:03:56ID:???
インデントはタブ、関数など括弧の前後は半角スペースで統一してます。
0292nobodyさん2005/10/28(金) 17:37:38ID:???
>>287
CGI.pm見たけどタブは使わずスペースのみだった。
0293nobodyさん2005/10/28(金) 17:43:28ID:???
>>292
何かの間違いじゃ・・・
ttp://search.cpan.org/src/LDS/CGI.pm-3.11/CGI.pm
こことか。133行目付近
unless ($OS) {
unless ($OS = $^O) {
require Config;
$OS = $Config::Config{'osname'};
}
}
0294nobodyさん2005/10/30(日) 20:33:55ID:???
お願いします。
ファイルハンドルを局所化することは可能でしょうか。
再帰したサブルーチンの中で毎回違うファイルを扱いたいのです。
0295nobodyさん2005/10/30(日) 20:49:09ID:???
すみません、何も考えずに質問したわけではないのですが、書いた後に
ファイルハンドルへのリファレンスだか型グロブだか(よく理解していない)を
局所化した変数に入れておけば解決できるのではと思いつきました。
その方向で調べてみますが、方向性が間違っていましたら教えてください。
0296nobodyさん2005/10/30(日) 20:51:31ID:???
オープン、処理、クローズまで一連の動作をするサブルーチンなら、難しいこと考えなくてもいいのでは。
引数にファイルを指定するぐらいかな?
0297nobodyさん2005/10/30(日) 21:05:36ID:???
ちょっと込み入ったことになってまして、
オープン、処理、クローズの、処理の部分でもう一度再帰的に自分自身を呼び出しているので、
クローズする前に同じハンドルで別ファイルをオープンしてしまってるんです。
0298nobodyさん2005/10/30(日) 21:14:33ID:???
>>297
http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlfaq5.html#How_can_I_make_a_filehandle_loca
0299nobodyさん2005/10/30(日) 21:59:42ID:???
>>298
ありがとうございます!!そのままずばりの質問でしかもFAQということで
まことに恐縮です。おかげさまで解決しました。
0300nobodyさん2005/10/30(日) 22:45:36ID:???
>>299
FAQに書いて無いようなので補足
モジュールが使える環境ならIO::Fileを使うことをお勧めする
0301nobodyさん2005/10/30(日) 23:02:00ID:ZWocYOMF
初心者です。
意味を教えて、と言うものです。ごめんなさい。
既存のソースを使って勉強中に、フォームをデコードしたい部分で

read(*******略*******);
undef(%in);

というものが出てきました。
undef とはどういう関数なのでしょうか。
リファレンスで探してみたのですが、名前付き単項演算子として列記されているだけで、
解説が載っていませんでした(初心者向けだから?)
ぐぐってみたものの、他の項目の解説用のソースばかり出てきてしまい、
undef の解説が見つけられず、困っています。よろしくお願いします。
0302nobodyさん2005/10/30(日) 23:06:21ID:???
見つからないわけねーだろ。
どういう調べ方してんだ。
0303nobodyさん2005/10/30(日) 23:09:40ID:ZWocYOMF
pear undef
で検索してみたのですが…
何か手がかりがあれば教えていただきたいのですが。お願いします。
0304nobodyさん2005/10/30(日) 23:11:28ID:???
>>302
まあまあ

>>301
Perlの組み込み関数は
perldoc -f 関数名
でマニュアルが見られる。ただし英語だけど。
日本語訳は
http://perldoc.jp/docs/perl/5.6.1/perlfunc.pod
http://www.att.or.jp/perl/man/perlfunc.1.html
このへん

で、undefがどういうものかというと、その変数の値を未定義にする関数。
まあ、その例ならば%inを空にすると考えてもらっても良いと思うよ
0305nobodyさん2005/10/30(日) 23:12:17ID:???
>>303
ってpearじゃなくてper「l」だヾ(゚Д゚#)ノ゙ゴルァ
0306nobodyさん2005/10/30(日) 23:20:17ID:ZWocYOMF
ありがとうございます。
(つづりまちがいは、ここに書いたときだけでした;)

ソースに undef(%in); と出てくるものの、 %in は後にも先にもここ一つなのですが…、
どこにも出てこない変数をクリアすることに意味はあるんでしょうか?
(もしかして、悪いモノを見本にしてしまったのでしょうか)
(呼び出しているプログラムは jcode.plのみです)
0307nobodyさん2005/10/30(日) 23:44:37ID:???
>>306
多分、%in は使っていないけど、$in{.......}
は使っているというオチだろうな。
0308nobodyさん2005/10/30(日) 23:46:23ID:???
>>306
%inじゃなくて$in{...}の形ででてきてるかもね。

しかし%inをundefして使いまわそうとしている
あたりあまり筋がよさそうではないので、手本に
はしないほうがいいんじゃないかなー。
0309nobodyさん2005/10/30(日) 23:48:12ID:???
>>306
> (もしかして、悪いモノを見本にしてしまったのでしょうか)
模範的といえるような綺麗なPerlスクリプトって正直なかなか無いからねぇ。
現状良い見本を見て育った人のほうが少ない気もする
0310nobodyさん2005/10/30(日) 23:51:26ID:???
駱駝本買っとけ
0311nobodyさん2005/10/30(日) 23:52:59ID:???
>>308
myで宣言してスコープアウトで自動で破棄させるべき、かな
03123012005/10/31(月) 00:25:50ID:8r5lDkYL
本屋で買った、初心者用CGIの本を頼りにやっていたので
載っていないことが多かったのですが、
教えていただいたリファレンスとかも読んで、わかってきました。

これまでに、COBOLしかやったことがなかったので、
勘違いしていることもありました(汗

ありがとうございました。
0313nobodyさん2005/10/31(月) 00:27:31ID:???
%inはcgi-lib.plからreadparseしてる予感!
0314nobodyさん2005/10/31(月) 00:33:54ID:???
[TAB]ってなんですか?
0315nobodyさん2005/10/31(月) 00:37:35ID:???
正規表現で使う「\t」の代替文字のことかな?
phpとかrubyでは良くみるけどperlで使えたっけ?
03163012005/10/31(月) 00:50:00ID:8r5lDkYL
>>313
cgi-lib.plは使ってないんです。

コボラーとしては、宣言もなしに変数がイキナリ使われていることに慣れません…
0317nobodyさん2005/10/31(月) 00:58:02ID:???
>>316
use strict;してないのはそんなのばっかりですよ。
大手よりも細々とやってるとこの方が、意外としっかりしたコードかいてることが多いです。
kentのはジンマシン出るかもしれないので注意してください。
0318nobodyさん2005/10/31(月) 01:00:04ID:???
>>316
英語アレルギーじゃないならCPANにあるソースでも読んでみると良いかもよ
http://www.cpan.org/scripts/index.html
03193012005/10/31(月) 01:17:17ID:???
use strict ってなんですか?
てか、[安全ではないコンストラクトを制限]と言われても
具体的にピンと来ないのですが・・・

自分で全部ソース書くよりも、
便利なモジュール使ったほうが間違いがない…ってことですかね。

Kent-webのCGIは、そのまま(改造とかナシで)使ったことがあります。
見た感じでは、ダラダラ〜っと大きいルーチンが書いてあって
読みづらいと思ったのですが(だからあんまり見てない)
見本にするには不向きってことですか?<ジンマシン
0320nobodyさん2005/10/31(月) 01:40:06ID:???
>>319
use strictは一言で言えば安全にプログラミングするためのプラグマだが…
とりあえず、一番のご利益は宣言の強制かな
my宣言をせずにいきなり変数を使おうとすると
エラーにするなどの機能を有効にする。というようなのがuse strict 'vars';
my $hoge = 'hogehoge';
print $hage; # use strict;すれば$hageは宣言されて無いのでエラー
見たいなミスを予防したりできる。

Kentは・・・まあ見本にはお勧めしないとだけ言っておこうか
0321nobodyさん2005/10/31(月) 02:43:49ID:???
KENTは悪い見本。最悪レベル。
いい見本は、コアモジュールのコードを読めばいいと思う。あと高いけど駱駝本
0322nobodyさん2005/10/31(月) 02:55:53ID:???
駱駝本は長い目で見れば高くはないさ。
0323nobodyさん2005/10/31(月) 03:03:40ID:???
>>321
良いにくいことをはっきり言うね…まあ同感なわけだけど
0324名無し募集中。。。2005/10/31(月) 03:15:06ID:s3JdPwyc
ラクダ本見辛いって思うのは私だけ?
03253012005/10/31(月) 03:24:24ID:???
>>302
ありがとうございます。
VBで言うところの、Option Explicit みたいな役割ってことでしょうか。

またまた質問なんですが、グローバル変数の宣言は、
$hensu;
だけでOKなんですか?
my とか local に相当する言葉はナシで良いのでしょうか。
(my と localについての解説しか見当たらないので)
検索していて our というのも見つかりましたが…
0326nobodyさん2005/10/31(月) 03:42:25ID:???
>>324
見るんじゃない、感じるんだ。

>>325
文法を 1 から 10 まで習うつもりか?
入門書か、perlsyn と strict.pm の perldoc ぐらい読んでから来いよ。
03273212005/10/31(月) 10:23:36ID:???
>>323
ま、ああいう言いにくいことは、自分のblogで書けないからね
ここでなら言っちゃってもいいかなーって思ってぶっちゃけたw
0328nobodyさん2005/10/31(月) 14:02:09ID:???
かと言って初心者がC-Board見ても仕方無いだろうなあ
0329nobodyさん2005/10/31(月) 16:26:16ID:mS98tkDz
文字列中の、<div id="aaa">から、それに対応する</div>までを消すにはどのように表せばいいんでしょうか?
<div id="aaa">から</div>までの間には、<div id="bbb">〜</div>とか<div id="cc">〜</div>とかがいっぱい入ってるんですが。。。
0330nobodyさん2005/10/31(月) 17:16:04ID:???
divの数を数えればいいじゃん。
開きが見つかれば+1
閉じが見つかれば-1
0の時点で閉じがあれば、そこで終了。
0331ヽ(´ー`)ノ ◆.ogCuANUcE 2005/10/31(月) 17:17:06ID:???
use strict;
use warnings;

use HTML::TreeBuilder;


my $doc = HTML::TreeBuilder->new_from_file('test.html');

map { $_->delete() } $doc->look_down('_tag' => 'div', 'id' => 'aaa');

print $doc->as_HTML();

こんでいいかね。
0332nobodyさん2005/10/31(月) 17:34:43ID:???
>>331
<q cite="http://www.kt.rim.or.jp/%7Ekbk/perl5.005/perlstyle.html">
戻り値をただ単に捨ててしまうような void 文脈で、grep() や map()、
`backticks` (訳注: `ls`のようにバッククォートで括った実行文のこと) を
使うことは避けましょう。そういった関数はすべて戻り値を持っているの
ですから、それを使うべきです。戻り値に用がないのであれば、代わりに
foreach() を使ったループか system() 関数を使いましょう。
</q>
0333ヽ(´ー`)ノ ◆.ogCuANUcE 2005/10/31(月) 18:42:21ID:???
>>332
あぁ、そうね。スマンカッタ。

$_->delete() for $doc->look_down('_tag' => 'div', 'id' => 'aaa');
0334nobodyさん2005/10/31(月) 22:40:16ID:???
if($test == $sample){
print"OK!!\n";
}
$test =1, $sample =1,
の時変数が数字なのか文字列なのかそれとも両方混じっているのか分からない時の
演算子はどうしたら言いのでしょうか。
eqで事足りると思うのですが、文字列と数字は分けなくて演算子をつかわなくてはいけないそうなのです。

すごく初心者的な質問ですいません。
0335nobodyさん2005/10/31(月) 22:50:00ID:???
>>334
たぶん宿題かなんかなんだろうが、お前はperlの前に
まず日本語を勉強しろ。何が言いたいのかさっぱり
わからん。
0336nobodyさん2005/10/31(月) 22:56:00ID:???
>>334
使わなくてはいけない、ではなくて自分がその中身をどう扱いたいか。
数値として扱いたいなら==を使えば良いし、文字列として扱いたいならeqを使えば良い。
数値として扱うというのは、"1.0"と"001"みたいなのも同じ1とする。
文字列として扱うというのは、これらを別のものとして扱うということだ。
03373362005/10/31(月) 23:01:33ID:???
>>334 質問にちゃんと答えてなかったかな。補足。
数値として扱えない文字が入っているのに数値として扱おうとする場合、
それ以降は無視される(1q3 => 1)
数値が入っているか文字列が入っているかわからないときに比較したいということは、
1q3と1axが同じ、と判断されちゃまずいということだよな。なら文字列として扱えば良い
03383342005/10/31(月) 23:43:09ID:???
レスありがとうございます。
演算子で数字と文字列同じように使えるeqの方が便利だからと言う理由でeqを多く使っていたのですが、
計算するわけでもないので、無理して==を使う必要がなく、「いけないではなくどう扱いたいか」で
凄く納得がいきました。
解りやすく説明していただきありがとうございます。
0339nobodyさん2005/11/01(火) 00:15:10ID:???
>>334
$hoge = "abc";
$hoge++;

一応こんなのも学んでおくといいかも
03403342005/11/01(火) 01:06:49ID:???
いろいろもう一度最初から見なおして見ます。
基礎的過ぎて詳しく説明しているところがあまりなかったので。
ありがとうございました。
0341nobodyさん2005/11/02(水) 15:33:18ID:lpDOmIjl
2台のサーバーにCSVテキストデータとCGIを別々において
CGIからCSVを読み込むにはどのようにすればよいでしょうか?
お願いします。
0342nobodyさん2005/11/02(水) 16:22:11ID:???
2台のサーバを統合する。
Socketモジュール系を使う
ftp.plライブラリを使う
0343nobodyさん2005/11/02(水) 16:27:42ID:???
>>341
nfs, ssh, http, ftp あたりでデータのやりとりすればOK。
03443412005/11/02(水) 16:38:32ID:lpDOmIjl
>>342-343
返信ありがとうございます。
ftp.plライブラリはどのようにして使うんでしょうか?
また、テキストファイルを定期的に更新したいんですが
どのようにすればよいでしょうか?
お願いします。
0345nobodyさん2005/11/02(水) 16:41:06ID:???
>>344
定期的な更新はcronコマンド。
ftp.plの使い方はググルのが吉。
03463452005/11/02(水) 16:42:13ID:???
↑我ながら「グルル」は良くないとおもた。
「ぐぐる」か「ググる」方が的確かl。
0347nobodyさん2005/11/02(水) 16:45:10ID:???
さすがにグルルはだめでしょう
グルルは
0348nobodyさん2005/11/02(水) 17:19:18ID:???
>>344
も少し詳しく書かないと分からないよ。

> また、テキストファイルを定期的に更新したいんですが
> どのようにすればよいでしょうか?

環境は? win? unix?
また、CGIスクリプトから更新したいの? 他のプログラムから?
0349nobodyさん2005/11/03(木) 17:31:58ID:???
CGI.pmを使って,スクリプトの状態をファイルに書き出しています.

if($cgi -> param(save)){
open(OUT,"> ./test.dat") || die;
$cgi -> save(OUT);
close(OUT);
}

このように,テキストエリアとチェックボックスのフォームデータを保存して,
別のcgiファイルで,読み込みをしています.

#フォームデータの読み込み
$file = "./test.dat";
open(IN,$file) if (-f $file);
$cgi = new CGI(IN);
close(IN);

テキストエリアはきちんと保存値が表示されたのですが,
チェックボックスが全て未チェックの状態になってしまいます.

なにかチェックボックスでは処理が必要なのでしょうか?
0350nobodyさん2005/11/03(木) 17:50:23ID:???
>>349
<input type="checkbox" name="hoge" value="hage" checked>
■ このスレッドは過去ログ倉庫に格納されています