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

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

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん05/01/27 18:08:42ID:???
Perlのコーディングで困ってる人のスレです。

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

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

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

過去ログやお勧めサイトは >>2-10
0655nobodyさん05/02/24 15:34:07ID:???
>>654
モジュールの中でファイルを絶対パスで指定しておき、デフォルトではそれを使う
デフォルト以外のパスを使う場合は、呼び出し側からコンストラクタの引数で指定する
というのがよくあるやりかただと思う
0656nobodyさん05/02/24 17:33:07ID:???
qw/a 1 2/;
この0番目をキーとしてそれ以降をそれぞれ違うハッシュの値としたいです。

my %hash;
sub{
@hash{qw/hoge hage/}->{$_[0]} = @_[1,2];
}->(qw/a 1 2/);

こんな感じで%hashの中にhogeとhageを作り、hogeとhageはそれぞれハッシュのリファレンスで、
それに大して値を一発で渡したかったのですが、エラーでした。

$hash{hoge}->{$_[0]} = $_[1];
$hash{hage}->{$_[0]} = $_[2];

ブサイクですがこういう方法しかないのでしょうか?
0657nobodyさん05/02/24 17:44:00ID:???
よくわからんけどこーゆーんがやりたいの?

$hash{'hoge'}->{$_[0]} = [ @_[1 .. @#_], ];
065865605/02/24 17:52:16ID:???
>>657
$hash{hoge}->{$_[0]} = $_[1];
$hash{hage}->{$_[0]} = $_[2];

これを一行で済ませたいんです。本当はhogeは10種類くらいあるのです。
なのでいちいち10行も使うと汚くなるので・・・
0659nobodyさん05/02/24 18:11:55ID:???
>>658
my $k = shift;
foreach (qw(hoge hage)) {
$hash{$_}->{$k} = shift;
}

でいちおうできると思うが、なんとなくデータ構造
見直したほうがいいんじゃないかという気もする。
066065605/02/24 18:19:24ID:???
>>659
ブロックですか・・・・
0661nobodyさん05/02/24 18:43:18ID:???
ブロックがいやなら:

my $k = shift;
$hash{$_}->{$k} = shift foreach (qw(hoge hage));


0662nobodyさん05/02/24 18:47:04ID:???
656に近い形で書くなら、
sub{
$hash{$_}->{$_[0]} = splice(@_,1,1) for qw/hoge hage/
}->(qw/a 1 2/);

でも、
>いちいち10行も使うと汚くなるので・・・
何ヶ所かで使うんだったら、659を関数化して使った方がいいと思うぞ。
066365605/02/24 20:13:43ID:???
>>661-662
やはり
@hash{qw/hoge hage/}->{$_[0]} = @_[1,2];
こういうのは無理なんですね。

色々あげてもらって悪いのですが、ぱっと見の読みやすさで
$hash{hoge}->{$_[0]} = $_[1];
$hash{hage}->{$_[0]} = $_[2];
こうしておきます。

これをするのは外部サブルーチンにすることで良しとしておきます。
すみませんですm(_ _)m
0664nobodyさん05/02/24 22:09:00ID:???
print qq|
@{[
map {"$i : $_<br>"} @array
]}
|;

こういう出力中にやるmapの中で$iに何回目のループかを持たせるにはどうすればいい?
my $i;
まずこれができないんだよね。
さらにmap {"$i : $_<br>"; $i++} @array
とすると$i++の渡されちゃう。なんか方法ないかな?
0665未承諾広告※ ◆TWARamEjuA 05/02/24 22:29:23ID:???
map { sprintf "%d : %s<br>", $i++, $_ } @array;
とか。
0666nobodyさん05/02/24 22:50:07ID:???
>>665
myはどうする?
0667nobodyさん05/02/24 22:50:38ID:???
>>666
localにする。
0668nobodyさん05/02/24 22:59:23ID:???
print qq{
@{[
map( "$_ : $array[$_]<br>", 0..$#array )
]}
};
じゃ、ダメなん?
0669nobodyさん05/02/24 23:08:22ID:???
1、特定のホストからアクセスを禁止したい
2、無知なので何もできず。。。
3、頭のエラーがでてできなかったw
0670nobodyさん05/02/24 23:30:51ID:???
>>667
どういうちがいがあるの?
0671nobodyさん05/02/24 23:49:43ID:???
>669
まずは頭のエラーを治してきて。
それはどうしようもねーや。
0672nobodyさん05/02/25 00:04:58ID:???
ハッシュの中にリファレンスも含んでる時ってどうやって安全にメソッドに渡すの?
&routin({%hash});
こうすると%hash自体は安全に見えるけど、もしもこの中身が
my %hash = (a=>1 , b=>[qw/1 2 3 4 5 6/] , c=>\("あいうえお"));

こんなのだったらbとcは渡された先でいじられた時にメイン側の$hash{b}にも
影響出るよね。
0673nobodyさん05/02/25 00:11:41ID:???
>>668
keys 使ったハッシュの場合とかじゃない?
0674nobodyさん05/02/25 00:17:31ID:???
>>672
参照を持つ言語は皆同じことで悩むね。
0675nobodyさん05/02/25 00:22:39ID:???
うむ、どうしようもないな

リファレンスの中身を再帰的に嘗めてってツリー全体を複製する手もあるのかもしれんが
ファイルハンドラやソケットを持ってると原理的にお手上げだし
0676nobodyさん05/02/25 00:25:59ID:???
さわんな禿げ!がベター。
0677nobodyさん05/02/25 01:05:47ID:???
改行コードの置換をしたくて
$value =~ s/\r\n|\r/\n/g;
としたのですが、これでは間違いようで馬鹿にされました。
$value =~ s/\x0A\x0D|\x0A/\0D/g;
JISの改行コードというサイトをみたらこれで合ってると思うのですが、大丈夫ですか?

それと改行コードはどうして\nでマッチを期待してはいけないのでしょうか?

067867205/02/25 01:08:15ID:???
>>674-676
おぅ、みんなそこらへんは適当にごまかしてるわけね^^;
まぁしょうがないかな。壊されては困るものは面倒でも一旦完全に紐解くよ。
ソケット云々はまだ知らないのでそこらへんはまたいずれ悩むかなw
0679nobodyさん05/02/25 01:14:10ID:???
>>677
>>585
0680nobodyさん05/02/25 02:37:30ID:???
>>672
弄られたくないものは渡さない。
0681nobodyさん05/02/25 02:41:38ID:SjmmN0vW
print "Content-type: text/html\n\n";
print "ほげほげ";
と、一度printしたものを出力させたくないのですが、
出力バッファの削除というのはどのようにすればいいのですか?
0682nobodyさん05/02/25 02:53:34ID:???
>>681
> 出力バッファの削除というのはどのようにすればいいのですか?
無理。

> 一度printしたものを出力させたくないのですが、
一度だけ出力するように設計する。
変数を使って、出力したかどうかを記憶させるなど。
0683nobodyさん05/02/25 02:57:02ID:???
>>682
ありがとうございます。
人の書いたソースにモノ組み込む必要がでてきてそれで…
元ソース書き換えて対処します。
0684nobodyさん05/02/25 04:04:19ID:???
>>672
readonlyなんとかとかいうモジュールで一時的に書き換え禁止にする。
$a = { b => { c = 1} }; $a->{b}{c} = 0とかもエラー吐いてくれる。
遅くなるけど
068567705/02/25 13:07:55ID:???
>>679
そこも見ました。
\x0A\x0D
と
\x0D\x0A
はどちらが正しいのですか?両方見るんですが。両方あるのでしゅう?
0686nobodyさん05/02/25 14:22:51ID:???
今日はじめてCGI::Cookieを使ってcookieを焼いていました。
今まではexpiresも自分でルーチン作ってやってましたが、ちょっと使ってみようかと思って。

そこで気付いたのですが、CGI::Cookieを使ってやると
new CGI::Cookie (-value => "文字列")
-valueの中の文字列は
$value =~ s/(\W)/'%' . unpack "H2",$1/eg;
これとかでエスケープを自動的にしてしまうのでしょうか?

アスタリスクが%2Aに変換されて困りました。
あンエスケープすれば言いといわれればそれまででsが。
068763005/02/25 14:34:51ID:???
>>650-651
セキリュティ対策バッチリのフォームメール制作経験がある方はいないでしょうか?
068864705/02/25 15:17:01ID:???
>>687
いやだから sendmail じゃなく Net::SMTP でなら作れるってば

sendmail の -t オプションの詳細仕様ってよく知らないのだが、
ちょっと考えただけでも以下のような疑問が浮かんでくる。

1. RFC822で許されている範疇の特殊文字でセキュリティ的な問題が生じるのか?

2. 生じるとしてそれをエスケープで回避できるのものなのか?

3. 回避できるとして、そのときに使うエスケープの方法は?
バックスラッシュをつける? URLエンコード? MIMEエンコード?

で、3まで考えると、エスケープするということ自体がかなり馬鹿馬鹿しいように
思えてきて仕方が無いんだが。
068963005/02/25 15:31:07ID:???
>>688
Net::SMTPですか。
ものすごい難しいそう・・・
sendmailでの話を知ってる方はいないのでしょうか?
0690nobodyさん05/02/25 15:34:52ID:???
>>689
Socketを使うよりずいぶん楽だぞ
0691nobodyさん05/02/25 15:36:42ID:???
変数の中に入ってる特定の文字列がありまして。
それがある回数以上でるようならそれ以後のその文字列部分は削除する正規表現
を書きたいです。

スイッチを持たせるのが一番?
my $swith = 0;
$value =~ s{(あいうえお)}{1}g;
あぁスイッチの保有方法忘れてるおrz

0692nobodyさん05/02/25 15:42:53ID:???
my $s = '1gaga2gaga3gaga4gaga5gaga6gaga7gaga8gaga';
my $p = 'gaga';

my $count = 0;
$s =~ s/(\Q$p\E)/++$count>=3?'':$1/ge;
069369105/02/25 16:22:22ID:???
>>692
どうもです。
0694nobodyさん05/02/25 16:26:07ID:???
>>689
とりあえず、ヘッダに含まれるのの改行だけはきっときゃいいんじゃないの
それしとかないとMTみたいなことになるし
0695nobodyさん05/02/25 17:16:26ID:???
744 :742:05/02/10 18:59:35 ID:???
>>743 Toにクエリを埋め込む時もメールのヘッダーが終わった後の本文でも 同じエスケープではないですよね?
とりあえず現状ではToの方は\だけエスケープしてます。 本文のほうは何もしてないままです。
UNIXのコマンド文になるようなのを気をつけなければならないのでしょうか?

745 :nobodyさん :05/02/10 22:07:44 ID:???
>>744
もしお前が釣りなら、俺を感動させたことを誇っていい。お前には才能がある。
もし本気でメール出すCGIを作るつもりなら、かなり道は険しいぞ。


こいつに聞くのが一番いいんじゃないか?
まあ俺はsendmailでエスケープ云々なんて今まで聞いたことがない。
っていうかそういうサイトを一度も見たことがない。
単純にだまされてるだけだろ。
0696nobodyさん05/02/25 19:16:12ID:???
>>685
Windows/DOSは\x0d\x0a
\x0a\x0dなんて環境は知らないなぁ。

ttp://www5.airnet.ne.jp/thepond/html/job/return.htm
ちょいとグーグルで見つけたサイトだけど、読んでおくといいよ。
0697nobodyさん05/02/25 20:16:25ID:???
>>686
value()を呼び出せばいいのでは?

ちょっと強引ですが
my %cookie = CGI::Cookie->fetch();
foreach(values %cookie){
$_ = $_->value();
}
とか

# CGI.pmから使うと、上の処理も不要になったりします。
# って、何か外してそうですね。
0698nobodyさん05/02/25 20:45:31ID:HRqs4JtA
現在利用しているサーバーで、
> sendmailやSocket関数およびSocketモジュールはセキュリティ上、使用できません。
と書かれているのですが、ネットワーク関連はあきらめるしかないですか?
0699nobodyさん05/02/25 20:55:25ID:???
@category = ('flower','car','house','your','sky');

↑上のようにカテゴリを設定しています。このカテゴリは並べ替えや変更、増減が頻繁にあります。
album.cgiでは上のカテゴリ別ページに飛ぶリンクを一覧表示させています。
そのリンク先であるカテゴリ別ページは?category=houseという形になっています。
カテゴリ別ページに、前後へのリンクを付けたいのです。
houseを開いた時はcarとyour、skyを開いた時はyourとflowerというように。
後ろが無い場合に一番前に帰ることは出来なくても構いません。
現在はカテゴリを変更する度にいちいち書き換えているのですが…。
自動的にリンク出来れば嬉しいのです。よろしければヒント等戴けませんか?
0700nobodyさん05/02/25 21:12:20ID:???
>>698
Perl コーディングとは関係無いレベルで無理だろう

>>699
カテゴリ別ページで「自分が何番目のカテゴリとして呼ばれたか」を調べて
配列的に+1とか-1とかしてリンクを生成すれば良いのでは
0701nobodyさん05/02/25 21:12:56ID:???
>>699
CGIの質問ですか?スレ違いだけどちょっぴり
受け取ったカテゴリ名と@categoriの中身を比較すれば

あとは誘導先で聞いてね

△▲ WebProg 初心者の質問 Part11 ▼▽
http://pc5.2ch.net/test/read.cgi/php/1101635909/
CGIとかPerlとか超初心者なんだけど、
http://pc5.2ch.net/test/read.cgi/php/995618200/
CGIだけど、なんか質問ある? Part 12
http://pc5.2ch.net/test/read.cgi/php/1097334246/
070269805/02/25 21:24:54ID:???
>>700
やっぱりですか・・・どうもありがとうございました。
0703nobodyさん05/02/25 21:57:54ID:???
>700
>701
スレ違いだったのですね、すみませんでした。
スレ違いだったのにヒント下さってありがとうございます。
おかげさまで思い付いたことがありますので、スマートな処理ではないのだと思いますが、試してみます。
それでも駄目でしたら誘導して戴けたスレッドの方で質問してみますね。

スレ汚しすみませんでした。ありがとうございました。
0704nobodyさん05/02/26 06:43:27ID:???
>>699
完全にリンクをつなげるには、現在位置$posから
my $prev = ($pos-1)%@category;
my $next = ($pos+1)%@category;
というように剰余を使うと簡単にできますよ。
0705nobodyさん05/02/26 13:28:48ID:???
my $value = 'a=1&b=2&c=0';

$valueの中は常にこのフォーマットにしておきたいので、
$valueの中身が違うフォーマットだったら中身を削除するというスクリプトを書きたい。

フォーマットが異常かどうかの条件式を日本語でいうと。
1.区切りは&
2.サブ区切りは=
3.キーや値は[a-zA-Z\-]のみ許容

これをPerlで書くとどうなりますか?
$value =~ /^[a-zA-Z]*=[a-zA-Z](?:&[a-zA-Z]*=[a-zA-Z])*$/;

これでどうでしょう。穴があったら教えて下さい。それともっといい方法があるならお願いします。
070670505/02/26 13:36:10ID:???
あ、iオプシションを使うと
$value =~ /^[a-zA-Z]*=[a-zA-Z](?:&[a-zA-Z]*=[a-zA-Z])*$/;
これが
$value =~ /^[a-z]*=[a-z](?:&[a-z]*=[a-z])*$/i;
こうできるのかな?
そんなわけない???
0707nobodyさん05/02/26 14:08:08ID:???
基本的な部分ですが、Perlでは文字列を数字として評価した場合に0以外が返されることはあるのでしょうか?
%formの中から値が数字で1以上でないものは削除したいんです。

%form = map { $form{$_} > 0 ? ($_,$form{$key}):() } keys %form;

これで文字列ははじけますか?
0708nobodyさん05/02/26 14:23:47ID:???
条件式AがあってそのAは%hashのキーをいくつか返してきます。
foreach (grep /\-/,keys %hash){
delete $hash{$_};
}

でも条件Aが返してくるリストの数が3以上のときだけ、それ以降を全てdeleteしたいのです。
my $i =0;
foreach (grep /\-/,keys %hash){
delete $hash{$_} if $i > 1;
$i++;
}

これでできます。しかし$iとか作るのダサイので嫌です。
mapやgrepで$iを作らずにリストの?個以降には特別な処理をするということはできませんか?
0709nobodyさん05/02/26 15:08:00ID:???
>>707
ソレダメ。
文字列も数値で10とか出せる。

例)
qq{10あいうえお}

だから面倒でも
$form{$_} =~ /^[\d]*$/ and $form{$_} > 0
とかするべきだね。
0710nobodyさん05/02/26 15:32:07ID:???
[\d]ってやる必要あったっけ?
0711nobodyさん05/02/26 16:05:09ID:???
>>708
やろうと思えば

delete @hash{sub{@_[2..$#_]}->(grep /\-/, keys %hash)};

とかできるけど、見やすいかどうかは知らん。
0712nobodyさん05/02/26 16:10:36ID:???
>>711
やっぱこのスレの人頭いいわ・・・
delete 八種スライス
がありなのすら知らなかった。
0713nobodyさん05/02/26 16:42:07ID:G5yzeqwR
Text::CSV_XSを使ってCSVファイルの作成をしているのですが、
とあるソフトではExcelの形式と違って改行はCRLFのみ、各項目は全てダブルクォートで
括ってないといけません。

どうすればいいでしょうか?改行問題は別にいいですが、どんな時も項目をダブルクォートの中に
入れるのはわかりません。宜しくお願いします。
0714nobodyさん05/02/26 17:00:42ID:???
>>713
always_quote。マニュアルよく読め。
0715nobodyさん05/02/26 17:20:53ID:???
正規表現のメタキャラを自分で決めることはできますか?
0716nobodyさん05/02/26 20:04:03ID:???
すごい初歩的なことなんだと思うのですがわかりません・・。

if ($NEDAN == "0"){$nedan_a = "非売品";}
elsif ($NEDAN == "rea"){$nedan_a = "レア";}
elsif ($NEDAN == "pre"){$nedan_a = "プレゼント";}
else {$nedan_a = $NEDAN."円";}

と書いてあり、$NEDANには「数字」か「0」「rea」「pre」がはいるのですが
「数字」の場合は最後のelse表記できちんと出るんですが
(100円とか200円というふうに)
「0」「rea」「pre」の場合、最後の「プレゼント」で表示されます。。
この部分だけでなにか悪いところがあるのでしょうか?
0717nobodyさん05/02/26 20:07:48ID:???
取り敢えず、そのアルゴリズム(?)はあんま良くないと思うよ。
実力にもよるけど全体的な見なおしを。

それをそのまま使うなら、
文字列を比べる時は「eq」を使ってぬ。
0718nobodyさん05/02/26 20:20:13ID:???
数値比較(==)では数に見えない文字列は0とみなされるので、
「非売品」になるならわかるが「プレゼント」になるのは
かなり不思議だ...
0719nobodyさん05/02/26 21:09:36ID:???
>>705
条件の\-は、どこへ? 値は数字では?

> my $value = 'a=1&b=2&c=0';
を見る限りの勝手な解釈では

 /(?:(?:^|\&)[a-zA-Z\-]\=\d)+$/;

ちなみに[a-zA-Z\-]に数字と '_' も含むなら \w が使える [a-zA-Z0-9_\-]→[\w\-]


0720nobodyさん05/02/26 21:42:50ID:???
フォーマットで出力する物を変数に代入出来ないのでしょうか?
どなたかご教授して頂けると嬉しいです(_ _)
自分で探したのですが、ファイルハンドルにしか出力する例しかみつからなくて。。
0721nobodyさん05/02/26 21:58:25ID:???
>>720
perlform(1)に書いてあるよ。swriteってサブルーチンの
例があるのでこれを使うのが楽じゃないかと。
0722nobodyさん05/02/27 02:37:46ID:G/Og0QBF
perlでクッキーの書き込みを行ったところうまくいかず、
クッキーの内容がブラウザに表示されてしまいました。
以下のプログラムは間違っているのでしょうか?

$cookie = "123";
$cookie =~ s/(\W)/sprintf("%%%02X", unpack("C", $1))/eg;

print "Set-Cookie: test=$cookie; expires=Thu, 1-Jan-2030 00:00:00 GMT\n\n";
0723nobodyさん05/02/27 02:52:08ID:???
たぶん >>722 に書いた部分以外のところが間違っているのだと思う
0724nobodyさん05/02/27 03:03:25ID:bNUaI+sL
>>722
あなたはきっとこうやってるのでしょう。

print "Content-type: text/html\n\n";
うにゃうにゃ
うにゃうにゃ
うにゃうにゃ
722のロジック

違うかい?
0725nobodyさん05/02/27 03:11:14ID:???
Perlについての質問箱 15箱目
http://pc5.2ch.net/test/read.cgi/tech/1105953092/623
0726nobodyさん05/02/27 07:05:37ID:???
>>722
ヘッダに各。
0727nobodyさん05/02/27 12:50:54ID:Ff0cBb5o
どこで聞いてよいかわからなかったのでこちらで。
mod_perlからPerl::RunにてPerlスクリプトを動かそうとしているのですが
ライブラリの参照先がApacheにおける標準のもの(?/apache/lib/perlとか)になってしまいます。
相対アドレスで任意に指定してやりたいのですが、可能でしょうか。
可能ならどうすればよいのでしょう?
0728nobodyさん05/02/27 13:41:22ID:???
use lib qw(/path/to/libdir);
0729nobodyさん05/02/27 13:45:48ID:???
>>728
ありがとうございます。試してみます。
0730nobodyさん05/02/27 14:08:37ID:G/Og0QBF
>>723
>>724
>>726

ありがとうございます。ヘッダに書いたらうまく動きました。
0731nobodyさん05/02/27 14:46:46ID:???
>>730
ム板のマルチにはちゃんと報告しとけよ。
0732nobodyさん05/02/28 11:38:59ID:???
テキスト$textの中にurlっぽいのを見つけたら
<a href="$url">$host</a>にすべて置換する
ただし$hostに'.jp'があれば$hostの部分は'日本'とする

ってのを作りたいのですが、
"ただし"以降がうまくできません。
どう書いたらよいでしょうか?
0733nobodyさん05/02/28 11:41:22ID:???
予め $host = '日本' if($host =~ /\.jp/) しとけばいいって話じゃないのか
0734nobodyさん05/02/28 11:45:17ID:???
$urlは元のままでほしいんです。
<a href="http://google.co.jp/">日本</a>
ってなかんじです。
0735nobodyさん05/02/28 12:01:41ID:???
よくわからんが、$url はそのままにしといて、$host だけ書き換えればいいように思う
0736nobodyさん05/02/28 12:14:24ID:???
説明悪くてすいません。
$text='googleはhttp://www.google.com/ですが、
google日本はhttp://www.google.co.jp/です。他にも(略)';
だとしたら、

$textが
googleは<a href="http://www.google.com/">www.google.com</a>ですが、
google日本は<a href="http://www.google.co.jp/">日本</a>です。他にも(略)
ってなってほしいんです。
$hostってのはurlにマッチしたうちのhostの部分って意味です。
0737nobodyさん05/02/28 13:08:20ID:???
>>736
$text=
'googleはhttp://www.google.com/ですが、
google日本はhttp://www.google.co.jp/です。他にも(略)'; 
$text =~ 
    s%
        http://([\w\d./]+)
    %
        my $tmp = $1;
        (($1=~/\.jp\/?$/) ?
            qq'<a href="http://$tmp">日本</a>' : 
            qq'<a href="http://$tmp">http://$tmp<;/a>')
    %xeg;
print $text;
0738nobodyさん05/02/28 13:57:59ID:???
テキストを<a>タグ化して、
そのあとに"日本"化すればよいんでは?

「urlっぽいのを見つけたら」なんて軽く書いてあるけど、結構面倒だよ。
<a>タグ化する正規表現だけでも。?、&、#、%とか含まれてたりするからね。
0739nobodyさん05/02/28 16:02:53ID:???
>>736
$text=~s((http://(?:[:@\w.-]+?(\.jp)(?::\d{1,5})?|[:@\w.-]+)[\w./~?=&;#+-]*))("<a href=$1>".($2?'日本':$1).'</a>')eig;
0740nobodyさん05/02/28 16:32:26ID:???
みんなわかってて答えてるんだと思うけど
一個の正規表現でやろうとしないほうが良いんじゃね
0741nobodyさん05/02/28 18:25:42ID:???
すごい初歩的な話ですが、
print "hoge";
my $value ="hage";

ダブルクォートってみなさん何を使ってますか?
私は今までqq||;っていうのが多かったですが、qq||これは入れ子できませんよね。
qq[]やqq{}ならどうやら入れ子がいくらでも可能だということに今日気付きました。

print qq[@{[ map qq[$_],qw/a b c/ ]}];
こういうことがqq[],qq{}ならできるんですね。

結構このスレを覗いてるとqq||っていう人が多いようです。
どうしてなのでしょうか?qq[]これで入れ子を作るのは偶然大丈夫なだけとか???
0742nobodyさん05/02/28 19:53:04ID:???
偶然ではなく、そういう仕様。
0743nobodyさん05/02/28 19:57:05ID:???
>>741
俺の場合は2ch掲示板スクリプトとかSJISで書いてるからSJISの全角文字に含まれないのを使ってる。
print qq()が多いかなぁ。その中にカッコつかいたかったらエスケープしないでprint qq!!にしてるよ。

まあ、なんでもいいんだけど。
0744nobodyさん05/02/28 19:57:46ID:???
>>736
$text =~ s|(http://([-a-z0-9.]+)[-_.!~*'()a-z0-9;/?:\@&=+\$,%#]*)|
"<a href=\"$1\">". (substr($2, -3) eq '.jp' ? '日本' : $2). "</a>"|ige;

>>741
私はperlopに出てくる汎用書式そのままにqq{}使ってます。

http://www.harukaze.net/~mishima/perl/man/perlop.1.html
> 選んだ区切文
> 字が括弧の類でない場合には、前後の文字として同一のものを使い
> ますが、4 つの括弧 ((), <>, [], {}) の場合にはネストできます。

ただ、括弧はきちんとネストしないとだめなので、Shift_JISで'日本'なんてリテラルがあると、
本の2バイト目が\x7b({)なので使えなかったりします。
074574105/02/28 20:56:25ID:???
>>742-744
SJISでの問題情報ありがとうございます。
やはりqq[]がベストですね。
0746nobodyさん05/02/28 21:23:11ID:???
>>745
SJISは2バイト目が、'[', ']' もあるから、そういう意味ではベストじゃないよ。
>>744の4つの中でSJISで使われないのは '(', ')' と '<', '>' だけだから。
0747nobodyさん05/02/28 21:35:23ID:???
>>745
Shift_JISの'ー'の2バイト目が\x5b([)なので、危険度は高いかと。
074874105/02/28 22:40:39ID:???
>>746-747
!?
でも()や<>はきついんですよね。
print qq<<html>>;
こういう感じになってHTMLの閉じ忘れがそのままPerlのエラーになりますよね。
prnt qq(${\(100*200)});
こっちは何でも大丈夫になるんですよね。
>>743さんの
>print qq()が多いかなぁ。その中にカッコつかいたかったらエスケープしないでprint qq!!にしてるよ。
という一言がもの凄く気になるんですが、ネストokですし・・・何をさしてるのでしょうか?
もしかして(これの片方だけをテキストとして埋め込む時などの事を言ってるのかな。
それだったらqq{}qq[]qq<>共通の問題ですよね。

qq{},qq[]これの問題点は基本的にSJISでコーディングするときだけで、EUCで普通に組む時は
変数内にSJIS文字が格納されていても問題ないから大丈夫なんですよね?

0749nobodyさん05/02/28 23:51:38ID:???
>>748
print qq[[];
これは括弧が合ってないからエラーになる。

そしてShift_JISで
print qq[コンピューター];
と書くと同じエラーになる。
原因は'ー'の2バイト目が\x5b([)だから。
…という話です。

同様に
print qq|酢|;
もアウトです。

use encoding "shiftjis";で回避はできますが、
(),<>,!や"といった\x20-\x3fの範囲の記号は
漢字コードとして使われないので、この問題は起きません。
またリテラルでなければ、問題ありません。
EUC-JPでは全く問題ありません。
0750nobodyさん05/03/01 00:42:29ID:???
>>749
open FH,">test.text" || &error("ダメだこりゃ");
こうやったんだけど何故かエラー処理が機能しない。
open (FH,">test.text") || &error("ダメだこりゃ");
こうやったら機能した。何でこんな不都合な優先順位なんだろうか・・・
関数をいちいち括弧で括るのは面倒だし、汚い。

my $dbh = DBI->connect() || &error("まずいよそれ");
これの場合は完全に機能しない。コネクトに失敗しても&errorが呼ばれない。
何とか呼ばれるようにしたいけど、この場合は無理なの?
0751nobodyさん05/03/01 00:46:44ID:???
or を使えよ。
0752nobodyさん05/03/01 00:49:31ID:???
connect に失敗するとその時点でエラー終了するから、当然 || 以降なんて呼ばれるわけがない
eval でトラップ汁
0753nobodyさん05/03/01 00:56:50ID:???
>>752
しない。
0754nobodyさん05/03/01 01:01:36ID:???
>>750
>>>749
>優先順位なんだろうか・・・
だよ
>関数をいちいち括弧で括るのは面倒だし、汚い。
or だよ
>この場合は無理なの?
俺に聞いてるの?
0755nobodyさん05/03/01 02:10:40ID:???
もしかして俺に聞いてるんだろうか
■ このスレッドは過去ログ倉庫に格納されています